TextWatcher llamado incluso si se establece el texto antes de agregar el observador

En una actividad de android, primero recupero el texto en un EditText y agrego entonces un TextWatcher a él.

private static int WC = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("TextWatcherTest", "onCreate:\t" +CLASS_NAME); setContentView(R.layout.main); EditText et = (EditText)findViewById(R.id.editText); Log.e("TextWatcherTest", "Set text xyz"); et.setText("xyz"); et.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { Log.e("TextWatcherTest", "afterTextChanged:\t" +s.toString()); } }); } 

Pero cuando ejecuto la actividad, el método afterTextChanged se llama aunque el Watcher se agregue después de establecer el texto. Así que la salida del registro es algo como

 OnCreate: LifecycleMain
 Establecer texto xyz
 // rotacion de pantalla
 OnCreate: LifecycleMain
 Establecer texto xyz
 AfterTextChanged: xyz 2

El contador en el TextWatcher muestra que el observador que se llama es el que se agregó después de que el texto se estableció en el EditText. Cualquier idea de por qué sucede y cómo puedo evitar eso?

La solución es mover su addTextChangedListener al método onPostCreate. Todo será resuelto.

Esto definitivamente debe estar sucediendo. Está configurando el texto cuando savedinstanceState no es nulo (significa que los estados de los objetos anteriores se guardan).

Creo que esto sucede porque usted agregó el TextWatcher a su EditText en el método onCreate, y la próxima vez que onCreate se llama (por ejemplo, después de un cambio de configuración), entonces encuentra que TextWatcher ya ha sido añadido a la EditText.

Si desea verificar esta situación, ponga esto antes de su condición:

 if(savedInstanceState == null){ Log.e("savedInstance state is null", "no text"); et.setText("No text"); } 

En este caso, si llama a setText en su EditText, entonces no se llamará afterTextChanged (Editable s).

  • Reemplazar el carácter dentro de TextWatcher en android
  • Permitir sólo 1 carácter en EditText y siempre sobrescribir cuando el usuario de entrada
  • ¿Cómo eliminar inmediatamente el espacio de un edittext si un usuario presiona el espacio?
  • Implementación de Text Watcher para EditText
  • Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged
  • Cómo cambiar TextView texto en DataChange sin llamada atrás TextWatcher Listener
  • Los eventos de TextWatcher se disparan varias veces
  • Eventos de TextWatcher se están llamando dos veces
  • Cómo hacer TextWatcher esperar un tiempo antes de hacer algo de acción
  • EditText no se actualiza después de que se cambió el texto en TextWatcher
  • Cómo actualizar el mismo EditText con TextWatcher?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.