Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

121

Unter welchen Umständen sollte ich afterTextChangedanstelle von onTextChangedund umgekehrt verwenden?

Wille
quelle

Antworten:

199

Diese Ereignisse werden in der folgenden Reihenfolge aufgerufen:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Dies bedeutet, dass die Zeichen durch neuen Text ersetzt werden sollen. Der Text kann nicht bearbeitet werden.
    Verwendung: Wenn Sie sich den alten Text ansehen müssen, der sich ändern wird.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Änderungen wurden vorgenommen, einige Zeichen wurden gerade ersetzt. Der Text kann nicht bearbeitet werden.
    Verwendung: Wenn Sie sehen möchten, welche Zeichen im Text neu sind.

  3. afterTextChanged (bearbeitbare s) .
    Das gleiche wie oben, außer dass der Text jetzt bearbeitet werden kann .
    Verwendung: Wenn Sie den neuen Text sehen und möglicherweise bearbeiten müssen.

Wenn ich nur auf Änderungen in höre EditText, muss ich die ersten beiden Methoden überhaupt nicht verwenden. Ich werde nur neue Werte in der dritten Methode erhalten und bei Bedarf neuen Text korrigieren. Wenn ich jedoch genaue Änderungen an den Werten feststellen müsste, würde ich die ersten beiden Methoden verwenden. Wenn ich den Text nach dem Anhören der Änderungen auch bearbeiten müsste, würde ich dies bei der dritten Methode tun.

Malcolm
quelle
Hat mir geholfen zu verstehen, warum das Ändern von Text in onTextChanged zu ANR führte.
Sukhvir Singh
12

public void afterTextChanged (Editable s)

Diese Methode wird aufgerufen, um Sie darüber zu informieren, dass sder Text irgendwo innerhalb geändert wurde. Es ist legitim, weitere Änderungen an sdiesem Rückruf vorzunehmen. Achten Sie jedoch darauf, dass Sie nicht in eine Endlosschleife geraten, da Änderungen, die Sie vornehmen, dazu führen, dass diese Methode rekursiv erneut aufgerufen wird. (Sie sind nicht gesagt , wo der Wechsel stattfand , weil andere afterTextChanged () -Methoden bereits andere Änderungen vorgenommen haben und für ungültig erklärt die Offsets. Aber wenn Sie hier wissen, können Sie setSpan(Object, int, int, int)in onTextChanged(CharSequence, int, int, int)Ihrem Platz markieren und dann von hier nachschlagen , wo Die Spanne endete.

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

Diese Methode wird aufgerufen, um Sie darüber zu informieren, dass sdie countZeichen , die bei beginnen start, durch neuen Text mit Länge ersetzt werden sollen after. Es ist ein Fehler, zu versuchen, Änderungen an sdiesem Rückruf vorzunehmen .

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

Diese Methode wird aufgerufen, um Sie darüber zu informieren, dass innerhalb sder countZeichen , die bei beginnen start, gerade alter Text mit Länge ersetzt wurde before. Es ist ein Fehler, zu versuchen, Änderungen an sdiesem Rückruf vorzunehmen .

Direkt aus der Android-Referenz für TextWatcher .

GregD
quelle
Warum sollten Sie nur den API-Code kopieren? Oft ist die API "unlesbar".
Matua
@matua Diese Frage / Antwort stammt von vor über 11 Jahren.
GregD
dann sollten Kommentare blockiert werden, denke ich :)
Matua
0

Android Textwatcher ist eine Art von Trigger, der beim Textwechsel eines Eingabefeldes aufgerufen wird.

afterTextChanged (Editable s)- Diese Methode wird aufgerufen, wenn der Text geändert wurde. Da Änderungen, die Sie vornehmen, dazu führen, dass diese Methode rekursiv erneut aufgerufen wird, müssen Sie bei der Ausführung von Operationen hier aufpassen, da dies sonst zu einer Endlosschleife führen kann .

onTextChanged (CharSequence s, int start, int before, int count)- Diese Methode wird aufgerufen, um Sie darüber zu informieren, dass innerhalb von s die am Anfang beginnenden Zählzeichen den alten Text ersetzt haben, der zuvor eine Länge hatte. Es ist ein Fehler, zu versuchen, über diesen Rückruf Änderungen an s vorzunehmen.

IntelliJ Amiya
quelle
6
Das Kopieren / Einfügen der Dokumentation ist nicht hilfreich und beantwortet die Frage nicht.
David Wasser