在什么情况下我应该使用afterTextChanged
代替,onTextChanged
反之亦然?
2 回答
这些事件按以下顺序调用:
beforeTextChanged(CharSequence s, int start, int count, int after)。
这意味着这些字符即将被一些新文本替换。文本不可编辑。
使用:当您需要查看即将更改的旧文本时。onTextChanged(CharSequence s, int start, int before, int count)。
已经进行了更改,一些字符刚刚被替换。文本不可编辑。
用途:当您需要查看文本中哪些字符是新的时。afterTextChanged(Editable s)。
与上面相同,除了现在文本是可编辑的。
使用:当您需要查看并可能编辑新文本时。
如果我只是在监听 中的变化EditText
,我根本不需要使用前两种方法。我将在第三种方法中接收新值,并在需要时更正新文本。但是,如果我必须追踪值发生的确切变化,我会使用前两种方法。如果我还需要在听完更改后编辑文本,我会在第三种方法中进行。
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
从此回调进行更改是错误的。