Android TextWatcher.afterTextChanged versus TextWatcher.onTextChanged

¿En qué circunstancias debo usar afterTextChanged lugar de onTextChanged y viceversa? Los ejemplos serían muy instructivos, prestando atención a por qué onTextChanged debe ser Anulado, pero afterTextChanged y beforeTextChanged no tienen que ser Anulados.

Estos eventos son llamados en el siguiente orden:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Esto significa que los personajes están a punto de ser reemplazados con algún texto nuevo. El texto no es editable
    Uso: cuando necesite echar un vistazo al texto anterior 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 es editable
    Uso: cuando necesite ver qué caracteres del texto son nuevos.

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

Si solo estoy escuchando los cambios en EditText , no necesitaré usar los dos primeros métodos. Recién 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 suceden a los valores, usaría los primeros dos 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.

vacío público afterTextChanged (Editable s)

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

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

Se llama a este método para notificarle que, dentro de s , los caracteres de count que comienzan al start están a punto de ser reemplazados por texto nuevo con una longitud after . Es un error intentar hacer cambios a s desde esta callback.

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

Se llama a este método para notificarle que, dentro de s , los caracteres de count que empiezan al start acaban de reemplazar el texto anterior que tenía una longitud before . Es un error intentar hacer cambios a s desde esta callback.

Directamente desde la Referencia de Android para TextWatcher .

Android Textwatcher es un tipo de disparador que se Android Textwatcher el cambio de texto de un campo de entrada.

afterTextChanged (Editable s) : se llama a este método cuando se ha cambiado el texto. Como 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 generar un bucle infinito .

onTextChanged (CharSequence s, int start, int before, int count) : se llama a este método para notificarle que, dentro de s, los caracteres de conteo que comienzan al principio acaban de reemplazar el texto anterior que tenía una longitud anterior. Es un error intentar hacer cambios a s desde esta callback.