Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
23 Май 2023
2 мин
783

Android: Обработка изменения текста в EditText

Часто разработчики Android-приложений сталкиваются с задачей, когда необходимо обрабатывать изменение текста в EditText. Возможный сценарий может включать

Часто разработчики Android-приложений сталкиваются с задачей, когда необходимо обрабатывать изменение текста в EditText. Возможный сценарий может включать два поля ввода, где изменение текста в одном поле должно вызывать очистку другого поля и наоборот.

Основная проблема

Допустим, у нас есть два поля ввода, field1 и field2. Мы хотим, чтобы при изменении текста в одном поле, текст в другом поле автоматически очищался. Используя стандартный метод addTextChangedListener, мы можем добавить обработчик изменения текста к каждому полю.

Однако, при попытке применить этот подход, приложение начинает «зацикливаться» и в конечном итоге приводит к сбою. Проблема заключается в том, что при изменении текста в field1 мы очищаем field2, что, в свою очередь, вызывает очистку field1, так как field2 также прослушивает изменения текста. Это приводит к бесконечному циклу изменений.

Решение проблемы

Для решения этой проблемы, мы можем использовать флаг, который будет отслеживать, совершается ли в данный момент программное изменение текста. Если это так, то мы просто проигнорируем событие изменения текста.

Вот пример реализации этого подхода:

boolean isProgramTextChange;

field1.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {}

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

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!isProgramTextChange){
            isProgramTextChange = true;
            field2.setText("");
            isProgramTextChange = false;
        }
    }
});

field2.addTextChangedListener(new TextWatcher() {
    public void afterTextChanged(Editable s) {}

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

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!isProgramTextChange){
            isProgramTextChange = true;
            field1.setText("");
            isProgramTextChange = false;
        }
    }
});

Таким образом, с помощью флага isProgramTextChange, мы можем контролировать процесс изменения текста и предотвратить зацикливание приложения.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий