2番目のedittext値が最初のedittext値に影響を与えると、2番目のedittextは2番目のedittextの値が変更され、2番目のedittextの結果が変更されます。私はテキストウォッチャーによって達成しました。そのため、stackOverflow例外をスローします。Textwatcherを使用しているときにStackOverflowエラーがスローされる
これは無限再帰ループを作成しますので、あなたはそれを行うことはできません
2番目のedittext値が最初のedittext値に影響を与えると、2番目のedittextは2番目のedittextの値が変更され、2番目のedittextの結果が変更されます。私はテキストウォッチャーによって達成しました。そのため、stackOverflow例外をスローします。Textwatcherを使用しているときにStackOverflowエラーがスローされる
これは無限再帰ループを作成しますので、あなたはそれを行うことはできません
を助けてください。 EditText1、EditText2、TextWatcher1、TextWatcher2があるとします。 EditText1に何かを入力すると、EditText2に書き込むTextWatcher1がトリガーされます。 EditText2を入力すると、TextWatcher2がトリガーされ、EditText1に書き込まれ、StackOverflow
の例外が発生するまでループは永久に続きます。
テキストの編集と両方のコールバックイベント(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;
}
});
}
}
値を更新する前に、他のフィールドのウォッチャーを削除する必要があります。 そして、ここで再取り付けリスナー はそれを行う方法のコードです:あなたの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);
}
});
あなたのコードを投稿し、我々は、ウィザードではありません。あなたはおそらく、2つのコールバック間の無限ループで終了しました – MatPag