在什么情况下我应该使用afterTextChanged
代替onTextChanged
,反之亦然?关注为什么onTextChanged
必须被覆盖但afterTextChanged
和beforeTextChanged
不必被覆盖的示例最有启发性。
答案 0 :(得分:177)
按以下顺序调用这些事件:
beforeTextChanged(CharSequence s,int start,int count,int after)。
这意味着字符即将被替换为一些新文本。 该文字无法编辑。
使用:,当您需要查看即将更改的旧文本时。
onTextChanged(CharSequence s,int start,int before,int count)。
已经进行了更改,一些字符已被替换。 该文字无法编辑。
使用:当您需要查看文本中的哪些字符是新的时。
afterTextChanged(可编辑的)。
与上面相同,除了现在文本是可编辑的
当您需要查看并可能编辑新文本时,使用:。
如果我只是在监听EditText
中的更改,我根本不需要使用前两种方法。我将在第三种方法中接收新值,并在需要时更正新文本。但是,如果我必须追踪值发生的确切变化,我会使用前两种方法。如果我在收听更改后也需要编辑文本,我会在第三种方法中执行此操作。
答案 1 :(得分:11)
public void afterTextChanged(可编辑的)
调用此方法是为了通知您,在
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
进行更改是错误的。
答案 2 :(得分:0)
Android Textwatcher
是一种被称为触发器的触发器 关于输入字段的文本更改。
afterTextChanged (Editable s)
- 当文本被更改时调用此方法。因为您所做的任何更改都会导致以递归方式再次调用此方法,所以您必须注意在此处执行操作,否则可能会导致无限循环。
onTextChanged (CharSequence s, int start, int before, int count)
- 调用此方法通知您,在s中,从start开始的计数字符刚刚替换了之前具有长度的旧文本。尝试从此回调中对s进行更改是错误的。