2016-04-14 9 views
0

私は2つの編集テキストを持っていますが、それぞれは最初の編集テキストが変更されたときに2番目の編集テキストを変更するテキストウォッチャーを持っています。コードがループを作成するようです。コードでテキストを変更するのではなく、ユーザーの入力を聞くだけですか?EditText addTextChangedListenerループ

et1.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

      double x = Double.valueOf(et1.getText().toString()); 
      et2.setText(String.valueOf((x*2))); 
     } 
    }); 

    et2.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

      double x = Double.valueOf(et2.getText().toString()); 
      et1.setText(String.valueOf((x/2))); 
     } 
    }); 
+0

あなたことができuse'FocusChangeListener() '(編集可能なS)afterTextChangedこの –

+1

'公共無効のため、{(mIsCalledFromWatcher!){mIsCalledFromWatcher = trueの場合、/*ものをする*/mIsCalledFromWatcher = false; }} '... [TextView.setText()](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L4211)を見てください何が起こっているのですか... setTextは別のafterTextChanged呼び出しを引き起こしています – Selvin

+0

あなたは無限ループを構築しました – jr593

答えて

1

あなたは、操作の前に、必要なときにそれらを削除するTextWatcher上の参照を保持し、後でそれを戻すことができます。

private TextWatcher tv1; 
private TextWatcher tv2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final EditText et1 = (EditText) findViewById(R.id.editText); 
    final EditText et2 = (EditText) findViewById(R.id.editText1); 

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

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

     @Override 
     public void afterTextChanged(Editable s) { 
      double x = Double.valueOf(et1.getText().toString()); 
      et2.removeTextChangedListener(tv2); // "disable" the watcher 
      et2.setText(String.valueOf((x*2))); 
      et2.addTextChangedListener(tv2); // "enable" the watcher 
     } 
    }; 

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

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

     @Override 
     public void afterTextChanged(Editable s) { 
      double x = Double.valueOf(et2.getText().toString()); 
      et1.removeTextChangedListener(tv1); // "disable" the watcher 
      et1.setText(String.valueOf((x/2))); 
      et1.addTextChangedListener(tv1); // "enable" the watcher 
     } 
    }; 

    et1.addTextChangedListener(tv1); 
    et2.addTextChangedListener(tv2); 
} 
関連する問題