2017-07-11 78 views
1

我一直試圖用EditText獲取特定的行爲。 這是我啓用了旋轉的簡單活動。當我輸入一些文字時,會觸發 onTextChanged方法。在orientationChange上觸發OnTextChanged,即使在onCreate方法後設置了TextWatcher方法

當我旋轉手機時,不應觸發此方法,因爲onInstanceState中已保存的文本已被設置爲onCreate方法中的EditText

但是,當我將手機旋轉回原來的方向時,方法會再次觸發!看到這篇文章末尾的logcat。

這是一個來自新創建的Android Studio項目的複製和粘貼代碼。

public class MainActivity extends AppCompatActivity { 

    EditText editText; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     editText = (EditText) findViewById(R.id.search_query); 
    } 

    @Override 
    protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     editText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       Log.d("MainActivity", "charSequence:" + charSequence); 
      } 

      @Override 
      public void afterTextChanged(Editable editable) { 

      } 
     }); 
    } 
} 

UPD:

的Android保持在默認情況下每個方向的變化在所有領域的EditText文本(具有唯一的ID)。這就是爲什麼當我旋轉我的手機時觸發onTextChanged。爲了避免這種情況,我在onCreate之後放置了onTextChanged監聽器,因此它將在文本設置爲EditText後監聽事件。但它不像預期的那樣工作(logcat)。檢查的最後一個環節以獲得更多信息

的logcat:

D/MainActivity: onCreate 
D/MainActivity: charSequence:a //entered manually 
D/MainActivity: charSequence:a // triggered on orientation change 
D/MainActivity: onDestroy 
D/MainActivity: onCreate 
D/MainActivity: onDestroy 
D/MainActivity: onCreate 
D/MainActivity: onDestroy 
D/MainActivity: onCreate 
D/MainActivity: onDestroy // no callback so far 
D/MainActivity: onCreate 
D/MainActivity: charSequence:ba // entered manyally 
D/MainActivity: onDestroy 
D/MainActivity: onCreate 
D/MainActivity: charSequence:ba // when came back to original "ba" orientation 
D/MainActivity: onDestroy 
D/MainActivity: onCreate 

相關: TextWatcher called even if text is set before adding the watcher

Android retain callback state after configuration change

+0

「...保存在onInstanceState中的文本已經在onCreate方法中設置爲EditText」我在代碼中看不到它。 –

+0

@WilliMentzel它由android系統設置。我認爲這個屬性叫做freezesText。檢查第二個鏈接 –

+0

請參閱更新的答案。 –

回答

0

this acticle看看,特別是在:

您可以看到,在第一EditText文本(用ID)將保持 沒有改變後的方向變化,的 TextChangedListeneronTextChanged()方法將也被稱爲,更新TextView

另一方面,當方向改變時,第二個EditText(未分配ID)將 清除爲空。

...你能避開它有兩種方法::

  • 卸下TextWatcher您設置的文本之前

無論如何,你可以在this答案athor抑制onTextChanged()像,並在之後添加它。

  • 或者在設置文本之前設置布爾標誌,該文本告訴TextWatcher忽略它。
  • 例如,

    boolean ignoreNextTextChange = true; ((EditText) 
    findViewById(R.id.MyEditText)).setText("Hello"); 
    

    而在你TextWatcher

    new TextWatcher() { 
        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) { 
         /* 
         If the flag is set to ignore the next text change, 
         reset the flag, and return without doing anything. 
         */ 
         if (ignoreNextTextChange){ 
          ignoreNextTextChange = false; 
          return; 
         } 
        } 
    
        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    
        } 
    
        @Override 
        public void afterTextChanged(Editable s) { 
    
        } }); 
    
    +0

    我只是不明白爲什麼這應該不會像我預期的那樣工作。當然,我可以避免這種怪癖,但我希望儘可能避免使用狀態和「ifs」,以使我的代碼清晰。 –

    +0

    @AndriiOmelchenko您應該將其作爲評論發佈。不鼓勵在不增加任何新內容的情況下引用另一個答案。圖片原始答案更改和您引用的答案保持不變。 –

    +0

    @WilliMentzel我正在更新答案並添加新內容。 –

    0

    如果你已經保存在savedInstanceState輸入的文本,然後只檢查是否已保存的變量,並基於該條件獲取來自它的價值,並設置它來編輯文本。無論多少次調用某種方法。 :D問題解決了。

    0

    所以,問題出在設備上。其他設備(如Nexus 5X)不會按預期顯示任何問題和代碼。

    相關問題