У меня есть два editTexts. Я хочу каждый раз проверять, был ли изменен текст, и если это так, я хочу также изменить текст второго.
Вот что я сделал:
TextWatcher fieldValidatorTextWatcherElec = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (filterLongEnough1()) {
et_electricite_€.setText(String.valueOf(new BigDecimal(Double.parseDouble(et_electricite.getText().toString())*tarif).setScale(2, RoundingMode.HALF_UP).doubleValue()));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
private boolean filterLongEnough1() {
return et_electricite.getText().toString().trim().length() > 0;
}
};
et_electricite.addTextChangedListener(fieldValidatorTextWatcherElec);
TextWatcher fieldValidatorTextWatcherElecTarif = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (filterLongEnough()) {
et_electricite.setText(String.valueOf(new BigDecimal(Double.parseDouble(et_electricite_€.getText().toString())/tarif).setScale(2, RoundingMode.HALF_UP).doubleValue()));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
private boolean filterLongEnough() {
return et_electricite_€.getText().toString().trim().length() > 0;
}
};
et_electricite_€.addTextChangedListener(fieldValidatorTextWatcherElecTarif);
Проблема в следующем: когда я нажимаю в первый раз, он меняется; когда я пытаюсь сделать то же самое со вторым editText, приложение не перемещается, а после этого вылетает. Вот журнал ошибок:
E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 2057252) E/MQSEventManagerDelegate: reportJEEvent error happened:android.os.TransactionTooLargeException: data parcel size 2057252 bytes
Он переходит в бесконечный цикл, потому что вы устанавливаете текст в слушателе изменения текста, который снова вызывает onTextChanged, как только вы устанавливаете текст в этом методе. Это приводит к бесконечному циклу, и приложение зависает
Как сказал @AvaniNagar, вам действительно не нужно использовать обработчик. Вы можете использовать простой текстовый наблюдатель и избавить себя от всего этого стресса.
Даже без обработчика это одно и то же




вы можете добавить слушателя редактирования текста. Поместите логику в afterTextChanged
EditText answer = new EditText(this);
//second, we create the TextWatcher
TextWatcher textWatcher = 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) {
}
@Override
public void afterTextChanged(Editable editable) {
//here, after we introduced something in the EditText we get the string from it
String answerString = answer.getText().toString();
//and now we make a Toast
//modify "yourActivity.this" with your activity name .this
Toast.makeText(yourActivity.this,"The string from EditText is: "+answerString,0).show();
}
};
//third, we must add the textWatcher to our EditText
answer.addTextChangedListener(textWatcher);
Почему вы используете его в обработчике? Вы также можете добавить наблюдателя текста без обработчика