Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

122

W jakich okolicznościach powinienem używać afterTextChangedzamiast onTextChangedi odwrotnie?

Będzie
źródło

Odpowiedzi:

199

Te zdarzenia są wywoływane w następującej kolejności:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Oznacza to, że znaki zostaną zastąpione jakimś nowym tekstem. Tekst jest nieedytowalny.
    Zastosowanie: gdy chcesz spojrzeć na stary tekst, który ma się zmienić.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Dokonano zmian, niektóre postacie zostały właśnie zastąpione. Tekst jest nieedytowalny.
    Użyj: gdy chcesz zobaczyć, które znaki w tekście są nowe.

  3. afterTextChanged (Edytowalne s) .
    Tak samo jak powyżej, z wyjątkiem tego, że teraz tekst jest edytowalny .
    Użyj: kiedy chcesz zobaczyć i ewentualnie edytować nowy tekst.

Jeśli tylko nasłuchuję zmian w programie EditText, w ogóle nie będę musiał używać pierwszych dwóch metod. Po prostu otrzymam nowe wartości w trzeciej metodzie i poprawię nowy tekst, jeśli będzie to konieczne. Gdybym jednak musiał wyśledzić dokładne zmiany, które zachodzą w wartościach, użyłbym dwóch pierwszych metod. Gdybym miał też potrzebę edycji tekstu po wysłuchaniu zmian, zrobiłbym to w trzeciej metodzie.

Malcolm
źródło
Pomogło mi zrozumieć, dlaczego zmiana tekstu w onTextChanged prowadziła do ANR.
Sukhvir Singh
12

public void afterTextChanged (s do edycji)

Ta metoda jest wywoływana w celu powiadomienia, że ​​gdzieś w środku stekst został zmieniony. Dalsze zmiany w stym wywołaniu zwrotnym są uzasadnione , ale należy uważać, aby nie wpaść w nieskończoną pętlę, ponieważ wszelkie wprowadzone zmiany spowodują ponowne wywołanie tej metody rekurencyjnie. (Nie wiesz, gdzie nastąpiła zmiana, ponieważ inne metody afterTextChanged () mogły już wprowadzić inne zmiany i unieważnić przesunięcia. Ale jeśli chcesz wiedzieć tutaj, możesz użyć setSpan(Object, int, int, int)in, onTextChanged(CharSequence, int, int, int)aby oznaczyć swoje miejsce, a następnie spojrzeć w górę, gdzie rozpiętość się skończyła.

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

Ta metoda jest wywoływana w celu powiadomienia, że ​​w sciągu countznaków zaczynające startsię od zostaną zastąpione nowym tekstem o długości after. Próba wprowadzenia zmian w stym wywołaniu zwrotnym jest błędem .

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

Metoda ta nazywana jest powiadomić Cię, że w terminie s, gdy countznaki rozpoczynającą się startwłaśnie zastąpić stary tekst, który miał długość before. Próba wprowadzenia zmian w stym wywołaniu zwrotnym jest błędem .

Prosto z referencji Androida dla TextWatchera .

GregD
źródło
Dlaczego miałbyś po prostu skopiować kod API? Często interfejs API jest „nieczytelny dla człowieka”.
matua
@matua To pytanie / odpowiedź pochodzi sprzed ponad 11 lat.
GregD
to chyba należy blokować komentarze :)
matua
0

Android Textwatcher to jeden rodzaj wyzwalacza, który jest wywoływany przy zmianie tekstu w polu wejściowym.

afterTextChanged (Editable s)- Ta metoda jest wywoływana, gdy tekst został zmieniony. Ponieważ wszelkie wprowadzone zmiany spowodują ponowne wywołanie tej metody rekurencyjnie, należy uważać na wykonywanie tutaj operacji, w przeciwnym razie może to doprowadzić do nieskończonej pętli .

onTextChanged (CharSequence s, int start, int before, int count)- Ta metoda jest wywoływana w celu powiadomienia, że ​​w ciągu s liczba znaków rozpoczynających się na początku właśnie zastąpiła stary tekst, który miał wcześniej długość. Próba wprowadzenia zmian do s z tego wywołania zwrotnego jest błędem.

IntelliJ Amiya
źródło
6
Skopiuj / wklej dokumentację nie jest pomocna i nie odpowiada na pytanie.
David Wasser