在什么情况下我应该使用afterTextChanged
而不是onTextChanged
反之亦然?例子将是最有启发性,注重为什么afterTextChanged
必须重写,但onTextChanged
并afterTextChanged
没有被覆盖.
按以下顺序调用这些事件:
beforeTextChanged(CharSequence s,int start,int count,int after).
这意味着字符即将被一些新文本替换.该文本是不可编辑的.
使用:当您需要查看即将更改的旧文本时.
onTextChanged(CharSequence s,int start,int before,int count).
已经进行了更改,一些字符已被替换.该文本是不可编辑的.
使用:当您需要查看文本中的哪些字符是新的时.
afterTextChanged(可编辑的).
与上面相同,除了现在文本是可编辑的.
使用:当您需要查看并可能编辑新文本时.
如果我只是在听取变化EditText
,我根本不需要使用前两种方法.我将在第三种方法中接收新值,并在需要时更正新文本.但是,如果我必须追踪值发生的确切变化,我会使用前两种方法.如果我在收听更改后也需要编辑文本,我会在第三种方法中执行此操作.
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)
调用此方法是为了通知您,在开头
s
的count
字符内,start
即将由具有长度的新文本替换after
.尝试s
从此回调进行更改是错误的.
public void onTextChanged(CharSequence s,int start,int before,int count)
调用此方法是为了通知您,在开头
s
的count
字符中,start
刚刚替换了具有长度的旧文本before
.尝试s
从此回调进行更改是错误的.
直接来自Android的TextWatcher参考.