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?
- Desactivación de la autocompletar para textarea y campos de entrada en Android Cordova-app
- ¿Puedes hacer una entrada de EditText de derecha a izquierda?
- Ocultar o quitar el botón del teclado en la pantalla CardIO Scann (Android)
- No se puede obtener backspace para trabajar en codemirror, bajo Phonegap en Android 4.x?
- Android4 sólo el navegador de valores comportamiento extraño con texto de entrada
- Phonegap 2.1.0 y android 4.1: Problema de entrada de texto
- Android 5 - Cambia la ruta de entrada de audio predeterminada para usar una tarjeta USB externa en Streaming
- Selector de fecha Android 4.1.1 / 4.1.2 Galaxy S3
- El cursor de Android 4.0 EditText siempre es invisible para editable = false
- ¿Cómo obtener la entrada de texto en lienzo?
- Android editText límite máximo
- Cómo proporcionar entrada a un campo de entrada webView mediante programación en Android Kitkat (4.4)
- Android: Añadir imageButton encima de un teclado personalizado
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 } } } );
- Problema con la carga de archivos javascript locales dentro de una vista web
- Imagen más grande para el primer elemento del android de gridview