Android TextWatcher.afterTextChanged против TextWatcher.onTextChanged

122

При каких обстоятельствах я должен использовать afterTextChangedвместо onTextChangedи наоборот?

Будет
источник

Ответы:

199

Эти события вызываются в следующем порядке:

  1. beforeTextChanged (CharSequence s, начало целого числа, число целых чисел, интервал после) .
    Это означает, что символы скоро будут заменены каким-то новым текстом. Текст не редактируется.
    Использование: когда вам нужно взглянуть на старый текст, который скоро изменится.

  2. onTextChanged (CharSequence s, int start, int до, int count) .
    Внесены изменения, только что заменены некоторые персонажи. Текст не редактируется.
    Использование: когда вам нужно увидеть, какие символы в тексте новые.

  3. afterTextChanged (редактируемые) .
    То же, что и выше, только теперь текст можно редактировать .
    Использование: когда вам нужно увидеть и, возможно, отредактировать новый текст.

Если я просто прислушиваюсь к изменениям EditText, мне вообще не нужно использовать первые два метода. Я просто получу новые значения в третьем методе и при необходимости исправлю новый текст. Однако, если бы мне пришлось отслеживать точные изменения, которые происходят со значениями, я бы использовал первые два метода. Если бы мне также понадобилось отредактировать текст после прослушивания изменений, я бы сделал это третьим способом.

Малькольм
источник
Помогло мне понять, почему изменение текста в onTextChanged приводило к ANR.
Sukhvir Singh
12

public void afterTextChanged (редактируемые)

Этот метод вызывается, чтобы уведомить вас о том, что где-то внутри sтекст был изменен. Допустимо вносить дальнейшие изменения sиз этого обратного вызова, но будьте осторожны, чтобы не попасть в бесконечный цикл, потому что любые внесенные вами изменения вызовут рекурсивный вызов этого метода. (Вам не сообщают, где произошло изменение, потому что другие методы afterTextChanged (), возможно, уже внесли другие изменения и сделали недействительными смещения. Но если вам нужно знать здесь, вы можете использовать setSpan(Object, int, int, int)in, onTextChanged(CharSequence, int, int, int)чтобы отметить свое место, а затем посмотреть отсюда, где промежуток закончился.

public void beforeTextChanged (CharSequence s, int start, int count, int после)

Этот метод вызывается , чтобы уведомить вас , что, в пределах s, то countсимволы , начинающиеся на startсобираетесь заменить новым текстом с длиной after. Попытка внести изменения sиз этого обратного вызова является ошибкой .

public void onTextChanged (CharSequence s, int start, int before, int count)

Этот метод вызывается , чтобы уведомить вас , что, в пределах s, то countсимволы , начинающиеся на startтолько что заменили старый текст , который имел длину before. Попытка внести изменения sиз этого обратного вызова является ошибкой .

Прямо из справочника Android по TextWatcher .

GregD
источник
Зачем просто копировать код API? Часто API оказывается «нечитаемым человеком».
матуа
@matua Этот вопрос / ответ был задан более 11 лет назад.
GregD
тогда комментарии должны быть заблокированы, я думаю :)
matua
0

Android Textwatcher это один из видов триггера, который вызывается при изменении текста в поле ввода.

afterTextChanged (Editable s)- Этот метод вызывается при изменении текста. Поскольку любые внесенные вами изменения приведут к повторному вызову этого метода рекурсивно, вы должны внимательно следить за выполнением операций здесь, иначе это может привести к бесконечному циклу .

onTextChanged (CharSequence s, int start, int before, int count)- Этот метод вызывается, чтобы уведомить вас о том, что в s символы count, начинающиеся с start, только что заменили старый текст, который имел длину раньше. Попытка внести изменения в s из этого обратного вызова является ошибкой.

IntelliJ Amiya
источник
6
Копирование / вставка документации бесполезно и не отвечает на вопрос.
Дэвид Вассер