Detectar si el contenido de EditText fue modificado por el usuario o por programa?

Necesitaría una manera de detectar si el EditText ha sido cambiado por el usuario que mecanografía algo o por el app que cambia el texto programmatically. Cualquier manera estándar de hacer esto? Supongo que siempre podría hacer algo hackish como desarmar el TextWatcher antes de setText() y establecer de nuevo después, pero hay que ser una mejor manera de hacer esto … ¿verdad?

Intenté comprobar si el EditText se enfocaba en el TextWatcher, pero ése era de poca ayuda puesto que el EditTexts consigue enfocado "semi-randomly" de todos modos al desplazar …

Fondo

Tengo un ListView con EditTexts en cada listitem. He resuelto el problema básico de almacenar los valores para los EditTexts para su reutilización cuando el usuario se desplaza.

También tengo un TextWatcher que resume los valores en todos los EditTexts y muestra la suma cuando el usuario edita el contenido de cualquiera de los EditTexts.

El problema es que cuando estoy desplazando la lista y mi adaptador personalizado está reentrando los valores almacenados en EditTexts en bindView() , que también activa el método afterTextChanged() , haciendo que el desplazamiento se retrasa porque la función de suma Se activa.

Esto se resolvió hace mucho tiempo, pero para cualquiera que encuentre su camino aquí en busca de una respuesta, esto es lo que hice:

Terminé fijando la etiqueta del EditText a un cierto valor arbitrario justo antes de que estoy a punto de cambiarlo programmatically, y cambiando el valor, y después reajustando la etiqueta a null. A continuación, en mi método TextWatcher.afterTextChanged () compruebo si la etiqueta es nula o no para determinar si fue el usuario o el programa que cambió el valor. ¡Funciona de maravilla!

Algo como esto:

 edit.setTag( "arbitrary value" ); edit.setText( "My Text Value" ); edit.setTag(null); 

y entonces

 public void afterTextChanged(Editable s) { if( view.getTag() == null ) // Value changed by user else // Value changed by program } 

La respuesta aceptada es perfectamente válida, pero tengo otro enfoque;

 @Override public void onTextChanged(CharSequence charSequence, int start, int before, int count) { boolean userChange = Math.abs(count - before) == 1; if (userChange) { } } 

Funciona comprobando si el cambio es un solo carácter. Esto no es una solución a toda prueba, ya que las operaciones de copiar y pegar pueden faltar, y los cambios que no sean de usuario de un solo carácter también se perderán. Dependiendo de su caso de uso, esto podría ser una solución viable.

Una cosa que me ayudó es tener un campo boolean canListenInput. Utilícelo dentro del vigilante.

  email.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { if (canListenInput) { emailChanged = true; } } }); 

Bórrelo antes de cambiar el texto mediante programación. Establecer dentro de la restauración onAttachedToWindow, (después del estado):

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); canListenInput = true; } 

Puede hacerlo añadiendo:

 private String current = ""; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(!s.toString().equals(current)){ [your_edittext].removeTextChangedListener(this); //Format your string here... current = formatted; [your_edittext].setText(formatted); [your_edittext].setSelection(formatted.length()); [your_edittext].addTextChangedListener(this); } 
  • Android utiliza el observador de texto para evitar escribir caracteres especiales
  • Clickable compuesto drawable en EditText que hace estallar una vista en tecleo
  • Android Manejo de muchos campos de EditText en un ListView
  • ¿Cómo elimino texto en EditText con TextWatcher? Cada vez que detecta una cadena y formatea su
  • Cómo manejar la tecla Intro usando TextWatcher en Android
  • Cómo cambiar TextView texto en DataChange sin llamada atrás TextWatcher Listener
  • Reemplazar el carácter dentro de TextWatcher en android
  • Quitar TextChangedListener y volver a agregarlo
  • Espaciado de letras en EditText para Android
  • Cómo dar formato a la entrada de EditText al escribir con separadores de miles (,) en Android?
  • AutocompleteTextView dinámico con ArrayAdapter y TextWatcher
  • Interesting Posts
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.