【问题标题】:Android TextWatcher.afterTextChanged vs TextWatcher.onTextChangedAndroid TextWatcher.afterTextChanged 与 TextWatcher.onTextChanged
【发布时间】:2010-10-03 08:58:53
【问题描述】:

什么情况下应该使用afterTextChanged而不是onTextChanged,反之亦然?

【问题讨论】:

    标签: android android-textwatcher


    【解决方案1】:

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

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

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

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

    如果我只是监听EditText 的变化,我根本不需要使用前两种方法。我将在第三种方法中接收新值,并在需要时更正新文本。但是,如果我必须追踪值发生的确切变化,我会使用前两种方法。如果我还需要在听完更改后编辑文本,我会使用第三种方法。

    【讨论】:

    • 帮助我理解了为什么更改 onTextChanged 中的文本会导致 ANR。
    【解决方案2】:

    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's Reference for TextWatcher

    【讨论】:

    • 为什么只复制 API 代码?很多时候,API 是“人类无法阅读的”。
    • @matua 这个问题/答案来自 11 多年前。
    • 我猜应该阻止 cmets :)
    【解决方案3】:

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

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

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

    【讨论】:

    • 复制/粘贴文档没有帮助,也无法回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2013-01-23
    • 1970-01-01
    • 2014-12-29
    • 2013-02-01
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多