Android のテキスト変更リスナーに質問する

Android のテキスト変更リスナーに質問する

2 つのフィールドがある状況があります。field1と です。 が変更されたときに をfield2空にし、その逆も実行したいだけです。 そのため、最終的には 1 つのフィールドだけにコンテンツが存在します。field2field1

field1 = (EditText)findViewById(R.id.field1);
field2 = (EditText)findViewById(R.id.field2);

field1.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
      field2.setText("");
   }
  });

field2.addTextChangedListener(new TextWatcher() {

   public void afterTextChanged(Editable s) {}

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

   public void onTextChanged(CharSequence s, int start,
     int before, int count) {
     field1.setText("");
   }
  });

addTextChangedListenerどちらか一方にアタッチした場合は正常に動作しますfield1が、両方のフィールドにアタッチするとアプリがクラッシュします。明らかに、お互いを無期限に変更しようとするためです。field1変更されるとクリアされ、field2その瞬間にfield2変更されるとクリアされfield1ます。

誰か解決策を提案してもらえますか?

ベストアンサー1

フィールド内のテキストが空でない場合にのみクリアするチェックを追加できます (つまり、長さが 0 と異なる場合)。

field1.addTextChangedListener(new TextWatcher() {

   @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(s.length() != 0)
        field2.setText("");
   }
  });

field2.addTextChangedListener(new TextWatcher() {

   @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(s.length() != 0)
         field1.setText("");
   }
  });

ドキュメントTextWatcher ここ

また、尊重してください命名規則

おすすめ記事