Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

122

Dans quelles circonstances dois-je utiliser à la afterTextChangedplace onTextChangedet vice versa?

Volonté
la source

Réponses:

199

Ces événements sont appelés dans l'ordre suivant:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Cela signifie que les caractères sont sur le point d'être remplacés par du nouveau texte. Le texte n'est pas modifiable.
    Utilisation: lorsque vous avez besoin de jeter un œil à l'ancien texte qui est sur le point de changer.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Des modifications ont été apportées, certains caractères viennent d'être remplacés. Le texte n'est pas modifiable.
    Utilisation: lorsque vous avez besoin de voir quels caractères du texte sont nouveaux.

  3. afterTextChanged (modifiables) .
    La même chose que ci-dessus, sauf que maintenant le texte est modifiable .
    Utilisation: lorsque vous avez besoin de voir et éventuellement de modifier le nouveau texte.

Si j'écoute simplement les changements EditText, je n'aurai pas du tout besoin d'utiliser les deux premières méthodes. Je recevrai simplement de nouvelles valeurs dans la troisième méthode et corrigerai le nouveau texte si nécessaire. Cependant, si je devais suivre les changements exacts qui se produisent dans les valeurs, j'utiliserais les deux premières méthodes. Si j'avais également besoin de modifier le texte après avoir écouté les modifications, je le ferais dans la troisième méthode.

Malcolm
la source
M'a aidé à comprendre pourquoi la modification du texte dans onTextChanged conduisait à l'ANR.
Sukhvir Singh
12

public void afterTextChanged (modifiables)

Cette méthode est appelée pour vous informer que, quelque part à l'intérieur s, le texte a été modifié. Il est légitime d'apporter d'autres modifications à spartir de ce rappel, mais veillez à ne pas vous plonger dans une boucle infinie, car toute modification que vous apportez entraînera l'appel de cette méthode de manière récursive. (On ne vous dit pas où la modification a eu lieu car d'autres méthodes afterTextChanged () ont peut-être déjà apporté d'autres modifications et invalidé les décalages. Mais si vous avez besoin de savoir ici, vous pouvez utiliser setSpan(Object, int, int, int)in onTextChanged(CharSequence, int, int, int)pour marquer votre place, puis rechercher à partir d'ici où la travée s'est terminée.

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

Cette méthode est appelée pour vous informer que, dans s, les countcaractères commençant à startsont sur le point d'être remplacés par un nouveau texte de longueur after. C'est une erreur d'essayer d'apporter des modifications à spartir de ce rappel.

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

Cette méthode est appelée pour vous avertir que, à l'intérieur s, les countcaractères commençant à startviennent de remplacer l'ancien texte qui avait de la longueur before. C'est une erreur d'essayer d'apporter des modifications à spartir de ce rappel.

À partir de la référence d' Android pour TextWatcher .

GregD
la source
Pourquoi voudriez-vous simplement copier le code API? Plusieurs fois, l'API est "illisible par l'homme".
matua
@matua Cette question / réponse date d'il y a plus de 11 ans.
GregD
alors les commentaires devraient être bloqués je suppose :)
matua le
0

Android Textwatcher est un type de déclencheur qui est appelé lors du changement de texte d'un champ de saisie.

afterTextChanged (Editable s)- Cette méthode est appelée lorsque le texte a été modifié. Étant donné que toute modification apportée entraînera le nouvel appel de cette méthode de manière récursive, vous devez être vigilant sur l'exécution des opérations ici, sinon cela pourrait conduire à une boucle infinie .

onTextChanged (CharSequence s, int start, int before, int count)- Cette méthode est appelée pour vous avertir que, à l'intérieur de s, les caractères de comptage commençant au début viennent de remplacer l'ancien texte qui avait une longueur avant. C'est une erreur de tenter d'apporter des modifications aux s à partir de ce rappel.

IntelliJ Amiya
la source
6
Copier / coller la documentation n'est pas utile et ne répond pas à la question.
David Wasser