Как выяснилось, среди слушателей (Listeners) визуального компонента EditText нет такого крайне востребованного слушателя, как слушатель изменения данных внутри компонента. У него имеются лишь следующие 11 слушателей:
OnClickListener - срабатывает при щелчке по полю ввода.
OnCreateContextMenuListener - срабатывает при построении контекстного меню.
OnDragListener - срабатывает при событиях перетаскивания отпускания.
OnEditorActionListener - срабатывает при нажатии Enter и при других команд редактирования, но не срабатывает на ввод обычных символов.
OnFocusChangeListener - срабатывает при потере или получении фокуса компонентом
OnGenericMotionListener - срабатывает при перемещении мыши над компонентом
OnHoverListener - срабатывает при возникновении события "hover", т.е. когда при наведении мыши изменяется внешний вид компонента.
OnKeyListener - срабатывает при нажатии кнопок аппаратной клавиатуры. При нажатии кнопок программной клавиатуры, как правило, не срабатывает.
OnLongClickListener - срабатывает при длительном удержании нажатия на компоненте
OnSystemUiVisibilityChangeListener - срабатывает при изменении видимости статусной строки в пользовательском интерфейсе системы.
OnTouchListener - срабатывает при касании компонента. При обработке этого события у меня почему-то зависала обработка события OnLongClickListener.
OnDragListener - срабатывает при событиях перетаскивания отпускания.
OnEditorActionListener - срабатывает при нажатии Enter и при других команд редактирования, но не срабатывает на ввод обычных символов.
OnFocusChangeListener - срабатывает при потере или получении фокуса компонентом
OnGenericMotionListener - срабатывает при перемещении мыши над компонентом
OnHoverListener - срабатывает при возникновении события "hover", т.е. когда при наведении мыши изменяется внешний вид компонента.
OnKeyListener - срабатывает при нажатии кнопок аппаратной клавиатуры. При нажатии кнопок программной клавиатуры, как правило, не срабатывает.
OnLongClickListener - срабатывает при длительном удержании нажатия на компоненте
OnSystemUiVisibilityChangeListener - срабатывает при изменении видимости статусной строки в пользовательском интерфейсе системы.
OnTouchListener - срабатывает при касании компонента. При обработке этого события у меня почему-то зависала обработка события OnLongClickListener.
Как видите, среди них нет ничего, что могло бы отследить элементарные изменения текста внутри компонента. Но помимо методов установки слушателей "setOn...", у компонента EditText есть интересный метод добавления слушателя с названием addTextChangedListener! Почему вместо установки слушателя, как сделано в 11 случаях, используется его добавление (в единственном случае) - мне непонятно.Тем не менее, используем эту возможность.
В качестве слушателя метод предлагает нам установить интерфейсный класс: TextWatcher. Как мы знаем, интерфейсный класс - это класс с пустыми методами, которые заполняются самим программистом. Методов в классе три: beforeTextChanged, onTextChanged и afterTextChanged. При возникновении события изменения текста они автоматически вызываются в определённом порядке. Их названия говорят сами за себя:
beforeTextChanged(CharSequence s, int start, int count, int after) - метод вызывается до изменений, чтобы уведомить нас, что в строке s, начиная с позиции start вот-вот будут заменены count символов, новыми after символами. Изменение текста s в этом методе является ошибкой.
onTextChanged(CharSequence s, int start, int before, int count) - метод вызывается, чтобы уведомить нас, что в строке s, начиная с позиции start, только что заменены after символов, новыми count символами. Изменение текста s в этом методе является ошибкой.
afterTextChanged(Editable s) - метод вызывается, чтобы уведомить нас, что где-то в строке s, текст был изменен. В этом методе можно вносить изменения в текст s, но будьте осторожны, чтобы не зациклиться, потому что любые изменения в s рекурсивно вызовут этот же метод.
Итак, пример подключения слушателя изменения текста к компоненту EditText:
editText1.addTextChangedListener(new TextWatcher(){ @Override public void afterTextChanged(Editable s) { // Прописываем то, что надо выполнить после изменения текста } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } });