Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged


Risposte:


199

Questi eventi vengono richiamati nel seguente ordine:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Ciò significa che i caratteri stanno per essere sostituiti con del nuovo testo. Il testo non è modificabile.
    Usa: quando devi dare un'occhiata al vecchio testo che sta per cambiare.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Sono state apportate modifiche, alcuni personaggi sono stati appena sostituiti. Il testo non è modificabile.
    Usa: quando hai bisogno di vedere quali caratteri nel testo sono nuovi.

  3. afterTextChanged (Modificabili) .
    Come sopra, tranne che ora il testo è modificabile .
    Usa: quando hai bisogno di vedere ed eventualmente modificare il nuovo testo.

Se sto solo ascoltando i cambiamenti in EditText, non avrò bisogno di usare i primi due metodi. Riceverò solo nuovi valori nel terzo metodo e correggerò il nuovo testo se necessario. Tuttavia, se dovessi rintracciare le modifiche esatte che si verificano ai valori, utilizzerei i primi due metodi. Se avessi anche bisogno di modificare il testo dopo aver ascoltato le modifiche, lo farei nel terzo metodo.


Mi ha aiutato a capire perché la modifica del testo in onTextChanged portava a ANR.
Sukhvir Singh

12

public void afterTextChanged (Modificabili)

Questo metodo viene chiamato per avvisarti che, da qualche parte all'interno s, il testo è stato modificato. È legittimo apportare ulteriori modifiche a sda questo callback, ma fai attenzione a non entrare in un ciclo infinito, perché qualsiasi modifica apportata farà sì che questo metodo venga chiamato di nuovo in modo ricorsivo. (Non viene detto dove il cambiamento è avvenuto perché altri afterTextChanged () metodi possono già hanno fatto altri cambiamenti e invalidato gli offset. Ma se avete bisogno di sapere qui, è possibile utilizzare setSpan(Object, int, int, int)in onTextChanged(CharSequence, int, int, int)per segnare il tuo posto e poi cercare da qui, dove la durata è finita.

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

Questo metodo viene chiamato per notificare che, all'interno s, i countcaratteri che iniziano per startstanno per essere sostituiti da un nuovo testo con lunghezza after. È un errore tentare di apportare modifiche a sda questo callback.

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

Questo metodo viene chiamato per avvisarti che, all'interno s, i countcaratteri che iniziano con starthanno appena sostituito il vecchio testo che aveva lunghezza before. È un errore tentare di apportare modifiche a sda questo callback.

Direttamente dal riferimento di Android per TextWatcher .


Perché dovresti semplicemente copiare il codice API? Molte volte l'API è "illeggibile dall'uomo".
matua

@matua Questa domanda / risposta è di oltre 11 anni fa.
GregD

quindi i commenti dovrebbero essere bloccati immagino :)
matua

0

Android Textwatcher è un tipo di trigger che viene chiamato al cambio di testo di un campo di input.

afterTextChanged (Editable s)- Questo metodo viene chiamato quando il testo è stato modificato. Poiché qualsiasi modifica apportata farà sì che questo metodo venga chiamato di nuovo in modo ricorsivo, devi stare attento all'esecuzione di operazioni qui, altrimenti potrebbe portare a un ciclo infinito .

onTextChanged (CharSequence s, int start, int before, int count)- Questo metodo viene chiamato per avvisarti che, entro s, i caratteri di conteggio che iniziano all'inizio hanno appena sostituito il vecchio testo che aveva lunghezza prima. È un errore tentare di apportare modifiche a s da questo callback.


6
Copiare / incollare la documentazione non è utile e non risponde alla domanda.
David Wasser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.