Diferencias entre TextWatcher onTextChanged, beforeTextChanged y afterTextChanged

En mi proyecto de Android, tuve que agregar un TextChangedListener (TextWatcher) a una vista de edición de texto. Y hay tres partes en eso.

  • onTextChanged
  • beforeTextChanged
  • afterTextChanged

¿Cuáles son los diferentes de estos tres? Tuve que implementar una búsqueda de una tabla en la lista de teclas y en mi caso, todas estas tres tienen el mismo aspecto. También funcionaron igual. Cuando ingreso una parte del nombre de un producto, la tabla se vuelve a dibujar con solo esos productos que contienen ese texto ingresado. Pero utilicé la parte afterTextChanged . Mi código es

 EditProduct.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub // System.out.println("onTextChanged"+s); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub // System.out.println("beforeTextChanged"+s); } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub // System.out.println("afterTextChanged"+s); String new_prx = s.toString(); System.out.println(s); mini_productList = new ArrayList(); // mini_productList int count = 0; if (new_prx.equals("")) { loadtableProducts(productList); } else { for (int i = 0; i < productList.size(); i++) { if (productList.get(i).getDescription().toString() .substring(0, (new_prx.length())) .equalsIgnoreCase(new_prx)) { mini_productList.add(productList.get(i)); count++; } } loadtableProducts(mini_productList); } } }); 

Entonces, ¿alguien puede darme una explicación sobre estos tres?

onTextChanged ejecuta durante el cambio de texto.

afterTextChanged ejecuta inmediatamente después de cambiar el texto.

beforeTextChanged ejecuta el instante antes de que se cambie el texto.

Dependiendo de cuándo desee asignar variables o hacer cosas, es posible que desee ejecutar el código el instante anterior al cambio o el instante posterior.

Aquí hay un ejemplo de esto:

 String afterTextChanged = ""; String beforeTextChanged = ""; String onTextChanged = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et = (EditText)findViewById(R.id.editText); et.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int st, int b, int c) { onTextChanged = et.getText().toString(); } @Override public void beforeTextChanged(CharSequence s, int st, int c, int a) { beforeTextChanged = et.getText().toString(); } @Override public void afterTextChanged(Editable s) { afterTextChanged = et.getText().toString(); Toast.makeText(Activity.this, "before: " + beforeTextChanged + '\n' + "on: " + onTextChanged + '\n' + "after: " + afterTextChanged ,Toast.LENGTH_SHORT).show(); } }); } 

En este caso, digamos que cambiaste el texto de “h” a “hola”, la salida sería:

antes: “h”
en: “hola”
después: “hola”

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

TextChangedListener tiene tres eventos.

1. BeforeTextChanged: Esto significa que los caracteres están a punto de ser reemplazados por algún texto nuevo. El texto no es editable Este evento se usa cuando necesita echar un vistazo al texto anterior que está a punto de cambiar.

2.onTextChanged: se han realizado cambios, algunos caracteres acaban de ser reemplazados. El texto no es editable Este evento se usa cuando necesita ver qué caracteres en el texto son nuevos.

3.afterTextChanged: lo mismo que arriba, excepto que ahora el texto es editable. Este evento se usa cuando necesita ver y posiblemente editar texto nuevo.

Los parámetros para beforeTextChanged y onTextChanged son un poco difíciles de entender al principio. Puede ser útil ver que se usen en un ejemplo. Mire la siguiente demostración algunas veces. Presta atención a los conteos.

  • El resaltado rojo es el texto antiguo que está a punto de ser reemplazado por el texto verde.
  • El resaltado verde es el nuevo texto que acaba de reemplazar el texto rojo.

enter image description here

beforeTextChanged

  • start es el índice de inicio del texto resaltado en rojo (que está a punto de eliminarse)
  • count es la longitud del texto resaltado en rojo (que está a punto de eliminarse)
  • after es la longitud del texto resaltado en verde (que está a punto de agregarse)

onTextChanged

  • start es el índice de inicio del texto resaltado en verde (que acaba de agregarse).
    Esto es lo mismo que el start de beforeTextChanged .
  • before es la longitud del texto resaltado en rojo (que acaba de eliminarse).
    Esto es lo mismo que el count de beforeTextChanged .
  • count es la longitud del texto resaltado en verde (que acaba de agregarse).
    Esto es lo mismo que after de beforeTextChanged .

afterTextChanged

  • editable es el texto editable de EditText. Puedes cambiarlo aquí. Al hacerlo, se volverán a activar todos los eventos de TextWatcher .
  • No se te da ninguna información sobre lo que ha cambiado. Si quieres saber, puedes establecer un lapso en onTextChanged y luego buscar el lapso aquí.

¿Cuándo usar qué?

Si desea observar los cambios que se están realizando, use beforeTextChanged() o onTextChanged() . Sin embargo, no está permitido cambiar el texto de CharSequence en ninguno de estos métodos.

Si desea modificar aún más el texto después de haberlo cambiado, hágalo en afterTextChanged() .

Código

Aquí está el código si quieres jugar con él.

MainActivity.java

 public class MainActivity extends AppCompatActivity { final static int RED_COLOR = Color.parseColor("#fb7373"); final static int GREEN_COLOR = Color.parseColor("#40de83"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText editText = findViewById(R.id.editText); final TextView tvBeforeText = findViewById(R.id.tvBeforeText); final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers); final TextView tvAfterText = findViewById(R.id.tvAfterText); final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { SpannableString spannableString = new SpannableString(s); BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR); spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tvBeforeText.setText(spannableString); tvBeforeNumbers.setText("start=" + start + " count=" + count + " after=" + after); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { SpannableString spannableString = new SpannableString(s); BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR); spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tvAfterText.setText(spannableString); tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count); } @Override public void afterTextChanged(Editable s) { Log.i("TAG", "afterTextChanged: " + s); } }); } } 

activity_main.xml

           
  • abstract void afterTextChanged(Editable s)

Este método se llama para notificarle que, en algún lugar dentro de s, el texto ha sido cambiado.

  • abstract 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 conteo que comienzan al inicio están a punto de ser reemplazados por texto nuevo con una longitud posterior.

  • abstract 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 recuento que empiezan al principio acaban de reemplazar el texto anterior que tenía una longitud anterior.

Puedes aprender más aquí .

  1. 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.

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

  3. 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.