Android TextWatcher.afterTextChanged与TextWatcher.onTextChanged


Answers:


199

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

  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,则根本不需要使用前两种方法。我只会在第三种方法中收到新值,并在需要时更正新文本。但是,如果必须跟踪发生在值上的确切更改,则可以使用前两种方法。如果在聆听更改后还需要编辑文本,则可以使用第三种方法。


帮助我理解了为什么在onTextChanged中更改文本会导致ANR。
Sukhvir Singh,

12

公共无效afterTextChanged(Editable 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)

调用此方法是为了通知您,在其中s,以count开头的字符start将被具有length的新文本替换after。尝试s对此回调进行更改是错误的。

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

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

直接来自Android的TextWatcher参考


您为什么只复制API代码?很多时候,API是“人类不可读的”。
马图阿

@matua这个问题/答案来自11年前。
GregD

那么评论应该被阻止,我猜:)
matua

0

Android Textwatcher 是一种在输入字段的文本更改时调用的触发器。

afterTextChanged (Editable s)-更改文本后将调用此方法。因为您所做的任何更改都将导致递归再次调用此方法,因此您必须注意此处执行操作,否则可能导致无限循环

onTextChanged (CharSequence s, int start, int before, int count)-调用此方法来通知您,在s内,从start开始的计数字符刚刚替换了以前具有长度的旧文本。尝试通过此回调对进行更改是错误的。


6
复制/粘贴文档没有帮助,也无法回答问题。
大卫·瓦瑟
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.