¿Cómo puedo detectar un evento de tecla de eliminación (retroceso) para un editText? Intenté usar TextWatcher, pero cuando editText está vacío, cuando presiono la tecla Eliminar, no pasa nada. Quiero detectar la pulsación de la tecla de eliminación para un editText incluso si no tiene texto.
android
events
android-edittext
key
Buda Gavril
fuente
fuente
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL
si no desea que el evento se dispare dos veces por presionar la tecla de retrocesoHa pasado un tiempo desde que preguntaste, pero tuve el mismo problema. Como ya ha mencionado Estel, el problema con los oyentes clave es que solo funcionan con teclados de hardware. Para hacer esto con un IME (teclado virtual) , la solución es un poco más elaborada.
El único método que realmente desea anular es
sendKeyEvent
en elEditText
'sInputConnection
de clase. Este método se llama cuando ocurren eventos clave en un IME. Pero para anular esto, necesitamos implementar una costumbreEditText
que anule elonCreateInputConnection
método, ajustando el valor predeterminadoInputConnection
objeto en una clase de proxy! : |Suena complicado, pero aquí está el ejemplo más simple que pude idear:
La línea con la llamada a
setRandomBackgroundColor
es donde ocurre mi acción especial de retroceso. En este caso, cambiando elEditText
color de fondo de.Si está inflando esto desde XML, recuerde usar el nombre completo del paquete como etiqueta:
fuente
Esto es solo una adición a la respuesta de Idris, agregando la anulación para deleteSurroundingText también. Encontré más información sobre eso aquí: Android: Retroceso en WebView / BaseInputConnection
fuente
deleteSurroundingText
bit era exactamente lo que necesitaba después de probar muchas otras soluciones.Aquí está mi solución fácil, que funciona para todas las API:
ACTUALIZACIÓN 17.04.18 .
Como se señaló en los comentarios, esta solución no rastrea la presión de retroceso si EditText está vacío (lo mismo que la mayoría de las otras soluciones).
Sin embargo, es suficiente para la mayoría de los casos de uso.
PD: Si tuviera que crear algo similar hoy, haría:
Luego utilícelo como un TextWatcher normal:
fuente
Envié 2 días para encontrar una solución y descubrí una que funciona :) (en teclas de función)
Después de agregar el textwatcher a su EditText:
Espero que también funcione en otros dispositivos Android (Samsung, LG, etc.).
fuente
Mi solución simple que funciona a la perfección. Deberías agregar una bandera. Mi fragmento de código:
fuente
Ejemplo de creación de EditText con TextWatcher
TextWatcher personalizado
fuente
para alguien que usa Kotlin
addOnTextChanged
no es lo suficientemente flexible para manejar algunos casos (por ejemplo: detectar si el usuario presiona eliminar cuando el texto de edición estaba vacío)setOnkeyListener
¡Funcionó incluso con el teclado suave o el teclado físico! pero solo en algunos dispositivos . En mi caso, funciona en Samsung s8 pero no funciona en Xiaomi mi8 se.si usa kotlin, puede usar la función crossline
doOnTextChanged
, es lo mismo queaddOnTextChanged
pero la devolución de llamada se activa incluso el texto de edición estaba vacío.NOTA: doOnTextChanged es parte de la biblioteca KTX de Android
fuente
doOnTextChanged
se puede acceder a la función de extensión en la biblioteca KTX de AndroidEditText
? Gracias de antemanoHay una pregunta similar en Stackoverflow. Debe anular
EditText
para obtener acceso alInputConnection
objeto que contiene eldeleteSurroundingText
método. Le ayudará a detectar el evento de eliminación (retroceso). Por favor, eche un vistazo a la solución que proporcioné allí, Android: no se puede capturar retroceso / eliminar presionar suavemente. tecladofuente
Esto parece funcionar para mí:
fuente
También me enfrento al mismo problema en Dialog ... porque estoy usando setOnKeyListener ... Pero establezco el retorno predeterminado verdadero. Después de cambiar como el código siguiente, funciona bien para mí.
fuente
Basado en @Jiff
ZanyEditText
aquí estáWiseEditText
consetSoftKeyListener(OnKeyListener)
fuente
Mi problema era que tenía personalizado
Textwatcher
, por lo que no quería agregarOnKeyListener
a unEditText
pozo ni tampoco quería crear personalizadoEditText
. Quería detectar si se presionó la tecla de retroceso en miafterTextChanged
método, por lo que no debería activar mi evento.Así es como resolví esto. Espero que sea de ayuda para alguien.
fuente
He probado la solución de @ Jeff en la versión 4.2, 4.4, 6.0. En 4.2 y 6.0, funciona bien. Pero en 4.4, no funciona.
Encontré una manera fácil de solucionar este problema. El punto clave es insertar un carácter invisible en el contenido de EditText al principio, y no permitir que el usuario mueva el cursor antes de este carácter. Mi forma es insertar un carácter de espacio en blanco con un ImageSpan de ancho cero en él. Aquí está mi código.
Y necesitamos un EditText personalizado que tenga un SelectionChangeListener
}
Y el ultimo paso
Y ahora, hemos terminado ~ Podemos detectar el evento de tecla de retroceso cuando EditText no tiene contenido real, y el usuario no sabrá nada sobre nuestro truco.
fuente
Esta pregunta puede ser antigua, pero la respuesta es realmente simple usando un TextWatcher.
fuente
Encontré una solución realmente simple que funciona con un teclado virtual.
fuente
Puede establecer un oyente clave en la actividad y, en el método de devolución de llamada, puede detectar qué tecla presionó el usuario. El siguiente código es para su referencia. Espero eso ayude.
fuente