2013-07-08 142 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