Ошибка Stackru выдает при использовании textwatcher

У меня есть два edittext, когда первое значение edittext изменяет, тогда результат изменяется во втором edittext наоборот, когда второе изменение значения edittext влияет на первое значение edittext. я достиг текстового наблюдателя. поэтому он вызывает исключение stackOverflow.

пожалуйста помоги

3 ответа

Вы не можете сделать это, потому что это создаст бесконечно рекурсивный цикл. Предположим, у вас есть EditText1, EditText2 и TextWatcher1, TextWatcher2 соответственно. Когда вы вводите что-то в EditText1, это вызывает TextWatcher1, который будет писать в EditText2. Ввод в EditText2 вызовет TextWatcher2, который будет писать в EditText1, и цикл продолжается до тех пор, пока вы не получите Stackru исключение.

Поскольку вы установили textChangeListener как для редактирования текста, так и для установки текста для обоих событий обратного вызова (onTextChangeListener), это будет бесконечная итерация. Он продолжит устанавливать текст на тексте редактирования одной стороны, и обратный вызов будет продолжать звонить. Следовательно, этот цикл будет продолжаться до тех пор, пока приложение не выйдет из строя. Изменить Чтобы достичь того, что вы хотите, смотрите ниже детали

Вы должны следить за тем, на каком редактируемом тексте у вас есть фокус (это для настройки текста в редактируемом тексте). Вам нужно иметь 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);

    }
});
Другие вопросы по тегам