Android的TextWatcher.afterTextChanged与TextWatcher.onTextChanged

在什么情况下,我应该使用afterTextChanged而不是onTextChanged ,反之亦然? 关于为什么onTextChanged必须被afterTextChanged ,但是afterTextChangedbeforeTextChanged不必被afterTextChanged ,示例将是最有启发性的。

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

  1. beforeTextChanged(CharSequence s,int start,int count,int after)
    这意味着angular色即将被replace为一些新的文字。 文本是不可编辑的。
    使用:当你需要看看即将改变的旧文本。

  2. onTextChanged(CharSequence s,int start,int before,int count)
    已经做出了改变,一些字符刚被replace。 文本是不可编辑的。
    使用:当您需要查看文字中的哪些字符是新的时。

  3. afterTextChanged(可编辑的)
    与上面相同,除了现在文本是可编辑的
    使用:当你需要看到和可能编辑新的文字。

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

public void afterTextChanged(可编辑)

这个方法被调用来通知你,在s某个地方,文本已经被改变了。 从这个callback中对s进行进一步的修改是合理的,但是要注意不要让自己陷入无限循环,因为你所做的任何修改都会导致这个方法被recursion调用。 (你没有被告知发生了什么变化,因为其他的afterTextChanged()方法可能已经做了其他的更改并且使得偏移无效。但是如果你需要知道这里,你可以在setSpan(Object, int, int, int)中使用setSpan(Object, int, int, int) onTextChanged(CharSequence, int, int, int)来标记你的位置,然后从这里查找跨度结束的位置。

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

这个方法被调用来通知你,在s ,从开始处startcount字符即将被长度为after新文本replace。 尝试从此callback中更改s是错误的。

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

这个方法被调用来通知你,在s ,从开始处startcount字符刚刚replace了before有长度的旧文本。 尝试从此callback中更改s是错误的。

正确的Android的TextWatcher参考 。

Android Textwatcher是一种被称为input字段文本转换的触发器。

文本观察员有三个事件。

afterTextChanged (Editable s) – 当文本被更改时调用此方法。 因为你所做的任何修改都会导致这个方法被recursion调用,所以你必须在这里执行操作,否则可能会导致无限循环

beforeTextChanged (CharSequence s, int start, int count, int after) – 调用此方法通知您,在s中,从开始处开始的计数字符即将由长度为后的新文本replace。 尝试从此callback中更改s是错误的。

onTextChanged (CharSequence s, int start, int before, int count) – 调用此方法通知您,在s中,从开始处开始的计数字符刚刚replace了之前长度过长的旧文本。 尝试从此callback中更改s是错误的。

为获得更好的信息,您可以访问这里

http://developer.android.com/reference/android/text/TextWatcher.html