EditText: Diferenciar entre cambio de texto por setText () o por entrada de teclado

Tengo una EditText View que es editado por setText() de mi código y por el usuario a través de (soft / hard) teclado y – si es posible por la entrada de voz. Quiero manejar la entrada hecha por mi código de otra manera que la entrada normal del usuario: si una entrada de usuario sucede, un evento interno se disparará. Pero no sé diferenciar entre ambos. Anteriormente – al desarrollar en el emulador – utilicé el método de onKeyDown() para coger la entrada del usuario. Sin embargo, al probar en un dispositivo real, me enteré, que onKeyDown() no se activa desde la entrada de teclado suave. Además la entrada de voz no sería reconocida por esto, aunque considero que esto es un defecto menor. Así que esa solución no es una opción para mí.

Por otro lado existe el método onTextChanged() , pero esto es activado tanto por setText() como por el teclado. Entonces, ¿cómo puedo diferenciar entre ambos o qué método sólo se llama por la entrada del usuario, pero no cuando se utiliza setText() , por lo que se puede sobrescribir?

Creo que android no le permiten distinguash entre el texto programado y manualmente introducido. La única solución para que utilice algún sla que indique cuando la prueba fue establecida por su código, porque siempre se sabe cuando se llama a setText ().

Finalmente resuelto el problema mediante la implementación de un InputConnectionWrapper (ver esta pregunta y en particular la respuesta para un ejemplo de implementación), que tiene varios métodos para obtener la entrada de un teclado suave. InputConnectionWrapper mi InputConnectionWrapper en el método EditText.onCreateInputConnection() . Para teclados duros utilizo EditText.onPreIme() . Todos estos métodos son sobrescritos y la ruta de su entrada a través de mi marco que maneja la entrada de texto y actualiza la vista en consecuencia. Esto significa que, en todos estos métodos sobreescritos (excepto para onCreateInputConnection() ) el método super no se llama porque actualizar la vista yo mismo. Esto evita las inconsistencias entre mi modelo de datos y la vista.

Puede utilizar un indicador para diferenciar.

 ((EditText) rootView.findViewById(R.id.editText1)).addTextChangedListener(new TextWatcher() { public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } public void afterTextChanged(Editable editable) { update(true); } }); private boolean updating = false; private void update(boolean multiply) { if(updating){ return; } updating = true; EditText editText1 = (EditText) getView().findViewById(R.id.editText1); editText1.setText("XXX"); updating = false; } 

Estaba teniendo este problema al girar el dispositivo. Mi editText está dentro de un diálogo. Así es como lo solucioné:

 editText.addTextChangedListener( new TextWatcher() { @Override public void afterTextChanged(Editable s) { String newValue = s.toString(); String oldValue = (String) editText.getTag(); if (newValue.length() > 0) { editText.setTag(newValue); } boolean itReallyChanged = oldValue != null && !newValue.equals(oldValue) && !newValue.isEmpty(); if (itReallyChanged) { // Pretty sure the user genuinely changed this value, // not the device rotation } } } ); 
  • Cómo personalizar el tipo de entrada de texto Android
  • Teclado Android: no inicializa el cliente de búfer compartido porque token = -12
  • Cambiar el fondo del mensaje de error de EditText
  • El atributo maxlength de la entrada en html no funciona en HTC One M7
  • Jquery enmascarado problema de entrada v1.4 con Samsung dispositivo Android
  • Android InputMethodManager tipo de entrada
  • Android OkHttp InputStream java.IOException.closed
  • Cómo utilizar InputConnectionWrapper?
  • Android: la entrada de html pierde foco cuando se abre el teclado virtual (ASP.net)
  • Introduzca la manipulación de claves en Libgdx TextField
  • No hay texto predictivo en Phonegap 2.2.0 en Android 4.0.3 con entrada type = "text"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.