Android TextWatcher.afterTextChanged与TextWatcher.onTextChanged

时间:2009-01-24 23:03:31

标签: android textwatcher android-textwatcher

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

3 个答案:

答案 0 :(得分:177)

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

  1. beforeTextChanged(CharSequence s,int start,int count,int after)
    这意味着字符即将被替换为一些新文本。 该文字无法编辑。
    使用:,当您需要查看即将更改的旧文本时。

  2. onTextChanged(CharSequence s,int start,int before,int count)
    已经进行了更改,一些字符已被替换。 该文字无法编辑。
    使用:当您需要查看文本中的哪些字符是新的时。

  3. afterTextChanged(可编辑的)
    与上面相同,除了现在文本是可编辑的 当您需要查看并可能编辑新文本时,使用:

  4. 如果我只是在监听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进行更改是错误的。

Android's Reference for TextWatcher开始。

答案 2 :(得分:0)

  

Android Textwatcher是一种被称为触发器的触发器   关于输入字段的文本更改。

afterTextChanged (Editable s) - 当文本被更改时调用此方法。因为您所做的任何更改都会导致以递归方式再次调用此方法,所以您必须注意在此处执行操作,否则可能会导致无限循环

onTextChanged (CharSequence s, int start, int before, int count) - 调用此方法通知您,在s中,从start开始的计数字符刚刚替换了之前具有长度的旧文本。尝试从此回调中对s进行更改是错误的。