128 votes

Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

Dans quelles circonstances dois-je utiliser afterTextChanged au lieu de onTextChanged et vice versa ? Des exemples seraient les plus instructifs, avec une attention particulière pour les raisons suivantes onTextChanged doit être surchargée mais afterTextChanged et beforeTextChanged n'ont pas à être surchargés.

214voto

Malcolm Points 14261

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 un nouveau texte. Le texte n'est pas modifiable.
    Utilisez : lorsque vous devez jeter un coup d'œil à l'ancien texte qui est sur le point de changer.
  2. onTextChanged(CharSequence s, int start, int before, int count) .
    Des changements ont été effectués, certains personnages ont juste été remplacés. Le texte n'est pas modifiable.
    Utilisez : lorsque vous avez besoin de voir quels caractères du texte sont nouveaux.
  3. afterTextChanged(Éditable s) .
    La même chose que ci-dessus, sauf que maintenant le texte est modifiable .
    Utilisez : lorsque vous avez besoin de voir et éventuellement de modifier un nouveau texte.

Si j'écoute juste les changements dans EditText je n'aurai pas besoin d'utiliser les deux premières méthodes. Je recevrai simplement les nouvelles valeurs dans la troisième méthode et je corrigerai le nouveau texte si nécessaire. Toutefois, si je devais suivre les modifications exactes apportées aux valeurs, j'utiliserais les deux premières méthodes. Si j'avais également besoin de modifier le texte après avoir écouté les changements, je le ferais avec la troisième méthode.

11voto

GregD Points 4434

public void afterTextChanged(Editable s)

Cette méthode est appelée pour vous informer que, quelque part dans s, le texte a été modifié. Il est légitime d'apporter d'autres modifications à s à partir de ce rappel, mais faites attention à ne pas vous mettre dans une boucle infinie, car toute modification apportée entraînera un nouvel appel récursif de cette méthode. (On ne vous dit pas où la modification a eu lieu car d'autres méthodes afterTextChanged() peuvent avoir déjà effectué d'autres modifications et invalidé les décalages. Mais si vous avez besoin de le savoir ici, vous pouvez utiliser setSpan(Object, int, int, int) dans onTextChanged(CharSequence, int, int, int) pour marquer votre place et ensuite regarder à partir d'ici où la portée a fini.

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

Cette méthode est appelée pour vous avertir que, dans un délai de s, les caractères du compte commençant par start sont sur le point d'être remplacés par un nouveau texte de longueur after. C'est une erreur de tenter d'apporter des modifications à s à partir de ce rappel.

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

Cette méthode est appelée pour vous notifier que, dans s, les caractères de comptage commençant par start viennent de remplacer l'ancien texte qui avait de la longueur auparavant. C'est une erreur d'essayer d'apporter des modifications à s à partir de ce rappel.

Droit de google .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X