Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

Respuestas:

199

Estos eventos se denominan en el siguiente orden:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Esto significa que los caracteres están a punto de ser reemplazados por texto nuevo. El texto no se puede editar.
    Uso: cuando necesite echar un vistazo al texto antiguo que está a punto de cambiar.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Se han realizado cambios, algunos personajes acaban de ser reemplazados. El texto no se puede editar.
    Usar: cuando necesite ver qué caracteres del texto son nuevos.

  3. afterTextChanged (editable s) .
    Lo mismo que el anterior, excepto que ahora el texto es editable .
    Usar: cuando necesite ver y posiblemente editar el nuevo texto.

Si solo estoy escuchando cambios en EditText, no necesitaré usar los dos primeros métodos en absoluto. Solo recibiré nuevos valores en el tercer método y corregiré el texto nuevo si es necesario. Sin embargo, si tuviera que rastrear los cambios exactos que ocurren en los valores, usaría los dos primeros métodos. Si también tuviera la necesidad de editar el texto después de escuchar los cambios, lo haría en el tercer método.

Malcolm
fuente
Me ayudó a entender por qué cambiar el texto en onTextChanged estaba dando lugar a ANR.
Sukhvir Singh
12

public void afterTextChanged (Editable s)

Este método se llama para notificarle que, en algún lugar dentro s, se ha cambiado el texto. Es legítimo realizar más cambios sdesde esta devolución de llamada, pero tenga cuidado de no meterse en un bucle infinito, porque cualquier cambio que realice hará que este método se vuelva a llamar de forma recursiva. (No se le dice dónde tuvo lugar el cambio porque otros métodos afterTextChanged () pueden haber realizado otros cambios e invalidado las compensaciones. Pero si necesita saber aquí, puede usar setSpan(Object, int, int, int)in onTextChanged(CharSequence, int, int, int)para marcar su lugar y luego mirar hacia arriba desde aquí donde el lapso terminó.

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

Este método se llama para notificarle que, dentro s, los countcaracteres que comienzan en startestán a punto de ser reemplazados por texto nuevo con longitud after. Es un error intentar realizar cambios sdesde esta devolución de llamada.

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

Este método se llama para notificarle que, dentro s, los countcaracteres que comienzan en startacaban de reemplazar el texto antiguo que tenía longitud before. Es un error intentar realizar cambios sdesde esta devolución de llamada.

Desde la Referencia de Android para TextWatcher .

GregD
fuente
¿Por qué simplemente copiaría el código API? Muchas veces la API es "ilegible para humanos".
matua
@matua Esta pregunta / respuesta es de hace más de 11 años.
GregD
entonces los comentarios deberían bloquearse, supongo :)
matua
0

Android Textwatcher es un tipo de disparador que se llama al cambiar el texto de un campo de entrada.

afterTextChanged (Editable s)- Este método se llama cuando se ha cambiado el texto. Debido a que cualquier cambio que realice hará que este método se vuelva a llamar de forma recursiva, debe estar atento a la realización de operaciones aquí, de lo contrario, podría conducir a un bucle infinito .

onTextChanged (CharSequence s, int start, int before, int count)- Este método se llama para notificarle que, dentro de s, los caracteres de recuento que comienzan en el inicio acaban de reemplazar el texto antiguo que tenía longitud antes. Es un error intentar realizar cambios en los correos electrónicos desde esta devolución de llamada.

IntelliJ Amiya
fuente
6
Copiar / pegar la documentación no es útil y no responde a la pregunta.
David Wasser