Android TextWatcher.afterTextChanged против TextWatcher.onTextChanged - PullRequest
108 голосов
/ 25 января 2009

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

Ответы [ 3 ]

178 голосов
/ 14 мая 2011

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

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

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

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

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

11 голосов
/ 25 января 2009

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 по TextWatcher .

0 голосов
/ 05 июня 2015

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

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

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

...