При каких обстоятельствах я должен использовать afterTextChanged
вместо onTextChanged
и наоборот?
Android TextWatcher.afterTextChanged vs TextWatcher.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 из этого обратного вызова.