Android TextWatcher.afterTextChanged与TextWatcher.onTextChanged

Wil*_*ill 113 android android-textwatcher

在什么情况下我应该使用afterTextChanged而不是onTextChanged反之亦然?例子将是最有启发性,注重为什么afterTextChanged必须重写,但onTextChangedafterTextChanged没有被覆盖.

Mal*_*olm 186

按以下顺序调用这些事件:

  1. beforeTextChanged(CharSequence s,int start,int count,int after).
    这意味着字符即将被一些新文本替换.该文本是不可编辑的.
    使用:当您需要查看即将更改的旧文本时.

  2. onTextChanged(CharSequence s,int start,int before,int count).
    已经进行了更改,一些字符已被替换.该文本是不可编辑的.
    使用:当您需要查看文本中的哪些字符是新的时.

  3. afterTextChanged(可编辑的).
    与上面相同,除了现在文本是可编辑的.
    使用:当您需要查看并可能编辑新文本时.

如果我只是在听取变化EditText,我根本不需要使用前两种方法.我将在第三种方法中接收新值,并在需要时更正新文本.但是,如果我必须追踪值发生的确切变化,我会使用前两种方法.如果我在收听更改后也需要编辑文本,我会在第三种方法中执行此操作.


Gre*_*egD 12

public void afterTextChanged(可编辑的s)

调用此方法是为了通知您,s文本中的某个位置已更改.s从这个回调中进行进一步的更改是合理的,但要注意不要让自己陷入无限循环,因为你所做的任何更改都会导致以递归方式再次调用此方法.(你是不是说当变化发生,因为其他afterTextChanged()方法可能已经做了修改和无效的偏移量.但是,如果你需要知道这里,你可以使用setSpan(Object, int, int, int)onTextChanged(CharSequence, int, int, int)标记你的地方,然后从这里那里仰望跨度结束了.

public void beforeTextChanged(CharSequence s,int start,int count,int after)

调用此方法是为了通知您,在开头scount字符内,start即将由具有长度的新文本替换after.尝试s从此回调进行更改是错误的.

public void onTextChanged(CharSequence s,int start,int before,int count)

调用此方法是为了通知您,在开头scount字符中,start刚刚替换了具有长度的旧文本before.尝试s从此回调进行更改是错误的.

直接来自Android的TextWatcher参考.