Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

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

Ответ 1

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

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

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

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

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

Ответ 2

public void afterTextChanged (Editable s)

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

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

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

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

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

Справа от Android Reference для TextWatcher.

Ответ 3

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

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

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