2013-07-08 102 views
23

我有一个令人讨厌的问题与TextWatcher。我一直在寻找网络,但没有找到任何东西。感谢有人能帮助我。TextWatcher事件被多次触发

出于某种原因,在TextWatcher事件对一个文本更改的调用不稳定。有时他们被触发一次(像他们应该),有时两次,有时是三次。不知道为什么,整个事情非常直截了当。有时候,afterTextChanged()的Editable参数会返回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()(以及AsyncTask)即时没有进行任何更改文本或EditText视图。

我看到Events of TextWatcher are being called twice中提出的问题,但即时消息触发的事件多于(或少于)两次。无论如何,感谢任何帮助。

编辑:我删除了afterTextChanged()的内容导致即使没有我的代码也会发生此问题。是什么让我相信这是一个错误。当一个普通的char(事件处理程序被触发两次)或者一个普通的char之后的空格char被删除(退格事件处理程序被触发3次)之后立即输入'space'字符时,会发生该错误。帮助仍然将不胜感激。

+0

你想在该适配器做什么?尝试检查'adapter.getCount()> 0'然后清除它。因为如果你得到适配器并清除它,适配器将仍然不为空。 – deadfish

+0

@deadfish适配器并不是真正的问题。它只是基于在TextWatcher中输入的文本而填充的列表。正如我所说的,问题是TextWatcher侦听器上的事件被调用的次数。它完全随机给我。 – AsafK

+0

是的,但每次更改与textwatcher相关的视图(更改文本状态)时都会调用textwatcher,你跟着我吗? – deadfish

回答

38

我有同样的问题,当我在一个连续的文本结束按压光标退格键,afterTextChange被称为3次: - 第一次用正确的价值 - 第二次带有明显值 - 第三次正确的值再次

具有搜索了很多在网络上后,我想我的EditText的inputType改变

android:inputType="textNoSuggestions" 

不要问我为什么,但它的工作, afterTextChanged现在只被调用一次。

+1

发生这种情况是因为在用户键入空格的情况下,某些设备将大写上一个单词(如果它是第一个单词并且inputType =“name”)。因此,afterTextChanged被调用两次。一次用于空间,一次用于大写字母。 – tambykojak

+1

这适用于尊重此输入类型的键盘。对于需要建议栏(即日语)的外语,它仍然会调用该方法两次。 –

7

据开发商页TextWatcher,如果一个变化中TextWatcherEditable情况,将触发进一步的调用链接到该Editable所有TextWatchers。现在,显然你的代码不会触发这种行为。

但是,如果出于某种原因系统在Editable上有TextWatcher,则很可能出现您描述的情况。 “为什么”,我听到你在哭,“这是否应该发生?”

首先,经典防御:没有理由不发生,严格来说,应该写入应用程序代码以便对其进行修复。

其次,我无法证明它,但我可以想象,处理EditText中显示文本布局的代码使用TextWatcher来处理更新屏幕上文本的显示。此代码可能会将控制代码(您未显示)插入Editable以确保良好的换行符等。它甚至可以去圆一个循环几次得到它的权利,它已经完成了所有的后您可能只得到您的第一个电话......

编辑

按照由@Learn OpenGL的评论ES,调用TextWatcher对于自动更正等内容来说是正常的。

+1

看起来像是自动更正;关闭它可以修复奇怪的回调。 –

1

u可以使用一个布尔检查,如:

inputBoxNumberEt.addTextChangedListener(new TextWatcher() { 

     boolean ignoreChange = false; 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 

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

     @Override 
     public void onTextChanged(CharSequence s, int start, 
            int before, int count) { 
      if (!ignoreChange) { 
       ///Do your checks      
       ignoreChange = true; 
       inputBoxNumberEt.setText(string); 
       inputBoxNumberEt.setSelection(inputBoxNumberEt.getText().length()); 
       ignoreChange = false; 
      } 
     } 
    }); 
3
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 
    } 
+0

欢迎velraj - 请添加一些文字来解释您的代码的逻辑 - 这将有助于其他人了解原始海报。请阅读如何回答 - https://stackoverflow.com/help/how-to-answer。例如,解释它与美国人的回答有什么不同。 – micstr