2017-12-29 16 views
-3

2番目のedittext値が最初のedittext値に影響を与えると、2番目のedittextは2番目のedittextの値が変更され、2番目のedittextの結果が変更されます。私はテキストウォッチャーによって達成しました。そのため、stackOverflow例外をスローします。Textwatcherを使用しているときにStackOverflowエラーがスローされる

これは無限再帰ループを作成しますので、あなたはそれを行うことはできません

+0

あなたのコードを投稿し、我々は、ウィザードではありません。あなたはおそらく、2つのコールバック間の無限ループで終了しました – MatPag

答えて

0

を助けてください。 EditText1、EditText2、TextWatcher1、TextWatcher2があるとします。 EditText1に何かを入力すると、EditText2に書き込むTextWatcher1がトリガーされます。 EditText2を入力すると、TextWatcher2がトリガーされ、EditText1に書き込まれ、StackOverflowの例外が発生するまでループは永久に続きます。

0

テキストの編集と両方のコールバックイベント(onTextChangeListener)のテキストの設定にtextChangeListenerを設定しているので、無限の繰り返しになります。それは一方の編集テキストにテキストを設定し続け、コールバックは電話を続けます。したがって、このサイクルはアプリケーションがクラッシュするまで実行を継続します。編集あなたが望むものを達成するために、以下の詳細を参照してください。

現在、どの編集テキストにフォーカスを当てているのかを把握する必要があります(これは編集テキストでテキストを設定するためのものです)。 2つのブール変数が必要です。コードを参照してください

public class MainActivity extends AppCompatActivity { 

EditText edt1, edt2; 
boolean et1Focus, et2Focus; 

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

    edt1 = findViewById(R.id.et1); 
    edt2 = findViewById(R.id.et2); 

      edt1.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      //quando o texto é alterado chamamos o filtro. 
      if (et1Focus) { 
       double valor = (s.length() > 0) ? Double.parseDouble(s.toString()) : 0; 
       valor = (valor * 100); 
       edt2.setText(String.valueOf(valor)); 
      } 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }); 

    edt2.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (et2Focus) { 
       double valor = (s.length() > 0) ? Double.parseDouble(s.toString()) : 0; 
       valor = (valor/100); 
       edt1.setText(String.valueOf(valor)); 
      } 
     } 

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

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }); 

    edt1.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      et1Focus = b; 
     } 
    }); 

    edt2.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View view, boolean b) { 
      et2Focus = b; 
     } 
    }); 
} 
} 
0

値を更新する前に、他のフィールドのウォッチャーを削除する必要があります。 そして、ここで再取り付けリスナー はそれを行う方法のコードです:あなたのonCreateメソッドで

(またはあなたがウォッチャーを添付したい場合)

ediText1.addTextChangedListener(textWatcher1 = 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) { 

      ediText2.removeTextChangedListener(textWatcher2); 
      ediText2.setText(s); 
      ediText2.addTextChangedListener(textWatcher2); 

     } 
    }); 

ediText2.addTextChangedListener(textWatcher2 = 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) { 

     ediText1.removeTextChangedListener(textWatcher1); 
     ediText1.setText(s); 
     ediText1.addTextChangedListener(textWatcher1); 

    } 
}); 
関連する問題