当前位置: 首页 > 知识库问答 >
问题:

TextWatcher事件被多次触发

漆雕绍晖
2023-03-14

我对TextWatcher有一个恼人的问题。我一直在网上搜索,但什么也找不到。如果有人能帮助我,我将不胜感激。

由于某些原因,在一次文本更改时对TextWatcher事件的调用是不稳定的。有时它们被触发一次(就像它们应该被触发的那样),有时两次,有时三次。不知道为什么,整个事情都很直截了当。有时,PostTextChanged()上的可编辑参数在toString()和length()中返回空值。

代码如下:

    private TextWatcher mSearchAddressTextChangeListener = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void afterTextChanged(Editable searchedAddress) {
           System.out.println("called multiple times.");   
        }
    };

afterTextChanged()(和异步任务)内,我没有对文本或编辑文本视图进行任何更改。

我看到TextWatcher的事件中提出的问题被调用了两次,但我触发的事件多于(或少于)两次。

无论如何,谢谢你的帮助。

编辑:我删除后TextChanged()的内容,因为即使没有我的代码,这个问题也会发生。是什么让我相信这是一个错误。当一个“空格”字符在一个常规字符(事件处理程序被触发两次)之后输入时,或者当一个“空格”字符在一个常规字符被删除后(退格。事件处理程序被触发3次),这个错误就会发生。


共有3个答案

充鑫鹏
2023-03-14

根据TextWatcher的开发者页面,如果在TextWatcher中对可编辑的进行更改,它将触发对链接到该可编辑的所有TextWatcher的进一步调用。现在,很明显,您的代码不会触发这种行为。

然而,无论出于何种原因,如果系统在可编辑页面上有一个TextWatcher,则很可能发生您描述的情况。“为什么”,我听到你哭了,“这会发生吗?”

首先,经典的辩护:没有理由不发生这种情况,严格来说,应用程序代码应该编写成能够适应这种情况。

其次,我无法证明这一点,但我可以很好地想象在EditText中处理显示文本布局的代码使用TextWatcher来处理更新屏幕上文本的显示。此代码可能会将控制代码(您没有显示)插入可编辑以确保良好的换行符等。它甚至可能会循环几次以使其正确,并且您可能只有在它完成所有操作后才会收到第一个调用...

编辑

根据@Learn OpenGL ES的评论,对于自动更正之类的事情,调用TextWatcher是正常的。

孙言
2023-03-14
boolean isOnTextChanged = false;

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    isOnTextChanged = true;
}

@Override
public void afterTextChanged(Editable quantity) {
    if (isOnTextChanged) {
        isOnTextChanged = false;
       //dosomething
    }
鄢修德
2023-03-14

我也遇到了同样的问题,当我在连续文本末尾用光标按下backspace时,在TextChange被调用3次后:-第一次使用正确的s值-第二次使用明确的值-第三次再次使用正确的值

在网上搜索了很多之后,我试着把我的EditText输入类型改为

android:inputType="textNoSuggestions"

不要问我为什么,但它成功了,afterTextChanged现在只调用一次。

 类似资料:
  • 在我的应用程序中,我将TextWatcher放在EditText上。当我更改EditText的文本时,TextWatcher的事件会被调用两次。 我正在使用模拟器来运行应用程序。

  • 我在我的应用程序中使用MutableLiveData进行基于事件的通信。我有单一活动两个片段架构。 在ViewModel的帮助下,我正在使用Fragment-1中的LiveData事件。但是,当我使用菜单栏用Fragment-2替换这个Fragment-1并最终返回Fragment-1时,LiveData的旧值再次被捕获。 如何避免这个问题?非常感谢任何帮助/建议!谢谢你。

  • 问题内容: 我试图用Javascript编写视频扑克游戏,以降低其基础知识,但是我遇到了一个问题,其中jQuery click事件处理程序多次触发。 它们被附加到用于下注的按钮上,并且对于在游戏过程中第一手下注(仅触发一次)非常有效。但是在秒针下注中,每次按下一个下注或下注按钮都会触发两次点击事件(因此,每次按下正确的赌注量是两次)。总体而言,在按一次下注按钮时,触发单击事件的次数遵循此模式序列的

  • 我有一个 Blob 存储容器,其中配置了事件网格触发器(Blob 已创建)。我正在通过数据工厂加载此 blob 存储文件,很多时候,许多文件可能会在一次尝试中出现在此 blob 中。也许我们可以举一个20个文件的例子。 好消息是我的事件网格触发器启动了,函数app被调用。然而,我发现有时对于同一个文件,事件网格触发器被触发了不止一次。 在这20个文件中,很少有文件非常大,比如300 MB,但其他文

  • 问题内容: 我有以下代码,但我的问题是该事件被触发了两次。我不知道是什么原因造成的。我怀疑是由供应商前缀引起的,但并非如此。即使我只离开,它仍然会开火两次。 CSS JS 问题答案: 对于您和,每个已转换的属性都会触发。 您可以在访问与事件关联的属性。 没有“ transition s end”事件,因此您可能需要一些技巧,例如仅过滤其中一个过渡属性的回调处理。例如: ps。没有浏览器会触发该事件

  • 第一次调用时,激发一次 第二次调用时,会激发两次 等等 编辑: 下面是一个jsfiddle示例(如下所示)。 要复制,请单击按钮,然后单击,然后单击一个并重复此过程 您将注意到,第二次执行该过程时,文本会加倍