Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged


121

За яких обставин я повинен використовувати afterTextChangedзамість цього onTextChangedі навпаки?

Відповіді:


199

Ці події називаються в такому порядку:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Це означає, що символи ось-ось будуть замінені на якийсь новий текст. Текст не піддається редагуванню.
    Використання: коли вам потрібно подивитися старий текст, який збирається змінити.

  2. onTextChanged (CharSequence s, int start, int раніше, int count) .
    Були внесені зміни, деякі символи щойно замінені. Текст не піддається редагуванню.
    Використання: коли вам потрібно побачити, які символи в тексті є новими.

  3. afterTextChanged (Можна редагувати) .
    Те саме, що вище, за винятком редагування тексту .
    Використання: коли вам потрібно переглянути та, можливо, відредагувати новий текст.

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


Допомогли мені зрозуміти, чому зміна тексту в onTextChanged призвела до ANR.
Сухвір Сінгх

12

публічна недійсність afterTextChanged (Можна редагувати)

Цей метод покликаний повідомити вас про те, що десь усередині 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 .


Чому ви просто копіювали код API? Багато разів API є "нечитабельним для людини".
matua

@matua Це запитання / відповідь було більш ніж 11 років тому.
GregD

то коментарі слід заблокувати, я думаю :)
matua

0

Android Textwatcher є одним з видів тригера, який викликається при зміні тексту поля введення.

afterTextChanged (Editable s)- Цей метод викликається, коли текст змінено. Оскільки будь-які внесені вами зміни призведуть до повторного виклику цього методу, вам слід бути уважним до виконання тут операцій, інакше це може призвести до нескінченного циклу .

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


6
Копіювання / вставка документації не корисне і не відповідає на запитання.
Девід Вассер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.