127

在什么情况下我应该使用afterTextChanged代替,onTextChanged反之亦然?

4

2 回答 2

212

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

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

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

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

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

于 2011-05-14T18:03:56.893 回答
12

public void afterTextChanged(Editable s)

调用此方法是为了通知您,在 中s的某处,文本已更改。对此回调进行进一步更改是合法的s,但请注意不要让自己陷入无限循环,因为您所做的任何更改都会导致再次递归调用此方法。(您不会被告知更改发生的位置,因为其他 afterTextChanged() 方法可能已经进行了其他更改并使偏移量无效。但是如果您需要在这里知道,您可以使用setSpan(Object, int, int, int)inonTextChanged(CharSequence, int, int, int)标记您的位置,然后从这里查找跨度结束了。

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

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

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

调用此方法是为了通知您,在 内s,以count开头的字符start刚刚替换了具有 length 的旧文本before。尝试s从此回调进行更改是错误的。

来自Android 的 TextWatcher 参考

于 2009-01-24T23:19:22.210 回答