【发布时间】:2010-10-03 08:58:53
【问题描述】:
什么情况下应该使用afterTextChanged而不是onTextChanged,反之亦然?
【问题讨论】:
标签: android android-textwatcher
什么情况下应该使用afterTextChanged而不是onTextChanged,反之亦然?
【问题讨论】:
标签: android android-textwatcher
这些事件按以下顺序调用:
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() 方法可能已经进行了其他更改并使偏移量无效。但是如果您需要在这里知道,您可以使用onTextChanged(CharSequence, int, int, int)中的setSpan(Object, int, int, int)来标记您的位置并然后从此处向上查找跨度结束的位置。
public void beforeTextChanged(CharSequence s, int start, int count, int after)
调用此方法是为了通知您,在
s中,以start开头的count字符将被长度为after的新文本替换。尝试通过此回调对s进行更改是错误的。
public void onTextChanged(CharSequence s, int start, int before, int count)
调用此方法是为了通知您,在
s中,以start开头的count字符刚刚替换了长度为before的旧文本。尝试通过此回调对s进行更改是错误的。
【讨论】:
Android Textwatcher是一种触发器,称为 关于输入字段的文本更改。
afterTextChanged (Editable s) - 当文本改变时调用这个方法。因为您所做的任何更改都会导致该方法再次被递归调用,所以您必须注意此处执行操作,否则可能会导致无限循环。
onTextChanged (CharSequence s, int start, int before, int count) - 调用此方法是为了通知您,在 s 内,从 start 开始的 count 个字符刚刚替换了之前有长度的旧文本。尝试通过此回调对 s 进行更改是错误的。
【讨论】: