Quiero capturar un evento cuando el usuario termine de editar EditText.
¿Cómo puede hacerse esto?
android
android-edittext
eddyuk
fuente
fuente
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Respuestas:
Cuando el usuario haya terminado de editar, presionará
Done
oEnter
fuente
Mejor manera, también puede usar EditText en el oyente FocusChange para verificar si el usuario ha realizado la edición: (No es necesario que el usuario presione el botón Listo o Enter en el teclado en pantalla)
Nota: Para más de un EditText, también puede permitir que su clase implemente,
View.OnFocusChangeListener
luego configure los oyentes para cada uno de ustedes EditText y validelos como se muestra a continuación.fuente
EditText
. Nunca perderá el enfoque.EditText
? ¿Tengo que usaronEditorAction
?EditText
, valida lo que haga el usuario para salir de la pantalla.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
Aunque escribí algo. Este es un texto de edición que solo acepta números.Personalmente, prefiero el envío automático después de finalizar la escritura. Así es como puede detectar este evento.
Declaraciones e inicialización:
Oyente en, por ejemplo, onCreate ()
Entonces, cuando se cambia el texto, el temporizador comienza a esperar a que ocurran los próximos cambios. Cuando ocurren, el temporizador se cancela y luego se inicia una vez más.
fuente
Handler
lugarPuedes hacerlo usando setOnKeyListener o usando un textWatcher como:
Establecer observador de texto
editText.addTextChangedListener(textWatcher);
luego llame
fuente
Aunque muchas respuestas apuntan en la dirección correcta, creo que ninguna de ellas responde a lo que estaba pensando el autor de la pregunta. O al menos entendí la pregunta de manera diferente porque estaba buscando una respuesta a un problema similar. El problema es "Cómo saber cuándo el usuario deja de escribir sin que él presione un botón" y desencadenar alguna acción (por ejemplo, autocompletar). Si desea hacer esto, inicie el temporizador en onTextChanged con un retraso que consideraría que el usuario dejó de escribir (por ejemplo, 500-700ms), para cada nueva letra cuando inicie el temporizador, cancele la anterior (o al menos use algún tipo de marcar que cuando marcan no hacen nada). Aquí hay un código similar al que he usado:
Tenga en cuenta que modifico el indicador booleano en ejecución dentro de mi tarea asíncrona (Task obtiene el json del servidor para autocompletar).
También tenga en cuenta que esto crea muchas tareas de temporizador (creo que están programadas en el mismo hilo, pero tendría que verificar esto), por lo que probablemente haya muchos lugares para mejorar, pero este enfoque también funciona y la conclusión es que debería usar un temporizador ya que no hay ningún evento "El usuario dejó de escribir"
fuente
tanto @Reno como @Vinayak B responden juntos si quieren ocultar el teclado después de la acción
fuente
Un enfoque diferente ... aquí hay un ejemplo: si el usuario tiene un retraso de 600-1000ms cuando está escribiendo, puede considerar que está detenido.
fuente
Bien, esto funcionará al 100% seguro.
Primero deberá configurar el oyente si el teclado se muestra u oculta. Si se muestra el teclado, probablemente el usuario esté escribiendo; de lo contrario, termine de escribir.
fuente
heightDiff > 100
cosas dan miedo en mi humilde opinión.Resolví este problema de esta manera. Usé kotlin.
fuente
Tuve el mismo problema y no quería depender de que el usuario presionara Listo o Enter.
Mi primer intento fue usar el oyente onFocusChange, pero ocurrió que mi EditText obtuvo el foco de forma predeterminada. Cuando el usuario presionaba alguna otra vista, onFocusChange se activaba sin que el usuario le hubiera asignado el foco.
La siguiente solución lo hizo por mí, donde onFocusChange se adjunta si el usuario toca EditText:
En mi caso, cuando el usuario terminó de editar la pantalla se volvió a renderizar, renovando así el objeto myEditText. Si se mantiene el mismo objeto, probablemente debería eliminar el oyente onFocusChange en onFocusChange para evitar el problema onFocusChange descrito al comienzo de esta publicación.
fuente
Tuve el mismo problema al intentar implementar "ahora escribiendo" en la aplicación de chat. intente extender EditText de la siguiente manera:
}
fuente
Terminé con ella con el mismo problema y no pude usar la solución con onEditorAction o onFocusChange y no quería probar el temporizador. Un temporizador es demasiado peligroso para su gusto, debido a todos los hilos y demasiado impredecible, ya que no sabe cuándo se ejecuta el código.
El onEditorAction no detecta cuando el usuario se va sin usar un botón y, si lo usa, tenga en cuenta que KeyEvent puede ser nulo. El enfoque no es confiable en ambos extremos, el usuario puede enfocarse y salir sin ingresar ningún texto o seleccionar el campo y el usuario no necesita salir del último campo EditText.
Mi solución usa onFocusChange y una bandera establecida cuando el usuario comienza a editar texto y una función para obtener el texto de la última vista enfocada, a la que llamo cuando lo necesito.
Simplemente borro el foco en todos mis campos de texto para engañar el código de vista de texto de salida. El código clearFocus solo se ejecuta si el campo tiene el foco. Llamo a la función en onSaveInstanceState para no tener que guardar la bandera (mEditing) como un estado de la vista EditText y cuando se hace clic en botones importantes y cuando se cierra la actividad.
Tenga cuidado con TexWatcher, ya que es una llamada que a menudo uso la condición en el foco para no reaccionar cuando el código onRestoreInstanceState ingresa texto. yo
fuente
He hecho algo como esta clase abstracta que se puede usar en lugar del tipo TextView.OnEditorActionListener.
fuente
Fácil de activar, termine de escribir en EditText
funcionó para mí, si usa java, conviértalo
En Kotlin
fuente