Mi diseño contiene ListView
, SurfaceView
y EditText
. Cuando hago clic en EditText
, recibe el enfoque y aparece el teclado en pantalla. Cuando hago clic en algún lugar fuera del EditText
, todavía tiene el foco (no debería). Supongo que podría configurar OnTouchListener
's en las otras vistas en el diseño y borrar manualmente el EditText
foco'. Pero parece demasiado hackish ...
También tengo la misma situación en la otra vista de lista de diseño con diferentes tipos de elementos, algunos de los cuales tienen EditText
dentro. Actúan como escribí anteriormente.
La tarea consiste en EditText
perder el foco cuando el usuario toca algo fuera de él.
He visto preguntas similares aquí, pero no he encontrado ninguna solución ...
fuente
hideSoftInputFromWindow()
luego limpia el enfoqueSobre la base de la respuesta de Ken, aquí está la solución de copiar y pegar más modular.
No se necesita XML.
Colóquelo en su Actividad y se aplicará a todos los EditTexts, incluidos los que están dentro de los fragmentos dentro de esa actividad.
fuente
MotionEvent.ACTION_DOWN
aMotionEvent.ACTION_UP
su código. ¡Gran respuesta por cierto!Para la vista principal de EditText, deje que los siguientes 3 atributos sean " verdaderos ":
seleccionable , enfocable , enfocableInTouchMode .
Si una vista desea recibir el enfoque, debe cumplir estas 3 condiciones.
Ver android.view :
Espero eso ayude.
fuente
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Simplemente coloque estas propiedades en la parte superior más primaria.
fuente
La respuesta de Ken funciona, pero es engañosa. Como pcans alude en el comentario de la respuesta, se podría hacer lo mismo con dispatchTouchEvent. Esta solución es más limpia ya que evita tener que piratear el XML con un FrameLayout transparente y ficticio. Así es como se ve:
fuente
Para mí debajo las cosas funcionaron -
1. Añadiendo
android:clickable="true"
yandroid:focusableInTouchMode="true"
alparentLayout
deEditText
ieandroid.support.design.widget.TextInputLayout
2. Anulación
dispatchTouchEvent
en la clase de actividad e inserción dehideKeyboard()
funciones3. Agregar
setOnFocusChangeListener
para EditTextfuente
Probablemente ya haya encontrado la respuesta a este problema, pero he estado buscando cómo resolverlo y todavía no puedo encontrar exactamente lo que estaba buscando, así que pensé que lo publicaría aquí.
Lo que hice fue lo siguiente (esto es muy generalizado, el propósito es darte una idea de cómo proceder, copiar y pegar todo el código no funcionará O: D):
Primero tenga EditText y cualquier otra vista que desee en su programa envuelta en una sola vista. En mi caso, usé LinearLayout para envolver todo.
Luego, en su código, debe configurar un Touch Listener en su LinearLayout principal.
Espero que esto ayude a algunas personas. O al menos les ayuda a empezar a resolver su problema.
fuente
Simplemente defina dos propiedades del padre de eso
EditText
como:Entonces, cuando el usuario toque fuera del
EditText
área, el enfoque se eliminará porque el enfoque se transferirá a la vista principal.fuente
Tengo un
ListView
compuesto deEditText
puntos de vista. El escenario dice que después de editar el texto en una o más filas, debemos hacer clic en un botón llamado "finalizar". UtilicéonFocusChanged
en laEditText
vista interior,listView
pero después de hacer clic en finalizar, los datos no se guardan. El problema se resolvió agregandodentro del
onClickListener
para el botón "finalizar" y los datos se guardaron correctamente.fuente
Realmente creo que es una forma más sólida de usar
getLocationOnScreen
quegetGlobalVisibleRect
. Porque me encuentro con un problema. Hay una vista de lista que contiene un texto de edición y un conjuntoajustpan
en la actividad. Encuentro quegetGlobalVisibleRect
devuelve un valor que parece incluir scrollY en él, pero event.getRawY siempre está junto a la pantalla. El siguiente código funciona bien.fuente
Para perder el enfoque cuando se toca otra vista, ambas vistas deben establecerse como view.focusableInTouchMode (verdadero).
Pero parece que no se recomienda el uso de focos en modo táctil. Eche un vistazo aquí: http://android-developers.blogspot.com/2008/12/touch-mode.html
fuente
La mejor manera es usar el método predeterminado
clearFocus()
¿Sabes cómo resolver códigos en
onTouchListener
verdad?Solo llama
EditText.clearFocus()
. Se aclarará el enfoque enlast EditText
.fuente
Como sugirió @pcans, puede hacer esta anulación
dispatchTouchEvent(MotionEvent event)
en su actividad.Aquí obtenemos las coordenadas táctiles y las comparamos para ver los límites. Si el toque se realiza fuera de una vista, haga algo.
Además, no es necesario verificar la existencia y visibilidad de la vista si el diseño de su actividad no cambia durante el tiempo de ejecución (por ejemplo, no agrega fragmentos o reemplaza / elimina vistas del diseño). Pero si desea cerrar (o hacer algo similar) el menú contextual personalizado (como en Google Play Store cuando usa el menú de desbordamiento del elemento) es necesario verificar la existencia de la vista. De lo contrario, obtendrá un
NullPointerException
.fuente
Este simple fragmento de código hace lo que quieres
fuente
En Kotlin
hidekeyboard () es una extensión de Kotlin
En actividad agregar dispatchTouchEvent
Agregue estas propiedades en la parte superior más primaria
fuente
Esta es mi versión basada en el código de zMan. No ocultará el teclado si la siguiente vista también es un texto de edición. Tampoco ocultará el teclado si el usuario simplemente se desplaza por la pantalla.
fuente