Me gusta que mis UI sean intuitivas; cada pantalla debe guiar al usuario de forma natural y discreta hacia el siguiente paso de la aplicación. Salvo eso, me esfuerzo por hacer las cosas lo más confusas y confusas posible.
Es una broma :-)
Tengo tres TableRow
s, cada uno contiene un control EditText de solo lectura y no enfocable y luego un botón a su derecha. Cada botón inicia la misma actividad pero con un argumento diferente. El usuario realiza una selección allí y finaliza la subactividad, llenando el correspondiente EditText
con la selección del usuario.
Es el mecanismo clásico de valores en cascada; cada selección reduce las opciones disponibles para la siguiente selección, etc. Por lo tanto, estoy deshabilitando ambos controles en cada una de las siguientes filas hasta que EditText en la fila actual contenga un valor.
Necesito hacer una de dos cosas, en este orden de preferencia:
- Cuando se hace clic en un botón, elimine inmediatamente el enfoque sin establecer el enfoque en un botón diferente
- Establezca el foco en el primer botón cuando comience la actividad
El problema se manifiesta después de que regresa la subactividad; el botón en el que se hizo clic conserva el enfoque.
Re: # 1 arriba - No parece haber un removeFocus()
método, o algo similar
Re: # 2 anterior: puedo usar requestFocus()
para establecer el enfoque en el botón en la siguiente fila, y eso funciona después de que regresa la subactividad, pero por alguna razón no funciona en la actividad principal onCreate()
.
Necesito coherencia en la interfaz de usuario en cualquier dirección: o ningún botón tiene el foco después de que finaliza la subactividad o cada botón recibe el foco según su lugar en el flujo lógico, incluido el primer (y único) botón activo antes de cualquier selección.
fuente
Antigua pregunta, pero me la encontré cuando tuve un problema similar y pensé en compartir lo que terminé haciendo.
La vista que ganó atención fue diferente cada vez, así que usé la muy genérica:
fuente
getCurrentFocus()?.clearFocus();
, tan agradable y elegante: - /Puede utilizar
View.clearFocus()
.Utilice
View.requestFocus()
llamado desdeonResume()
.fuente
android:descendantFocusability="beforeDescendants"
el uso de lo siguiente en la actividad con algunas opciones de diseño a continuación pareció funcionar como se desea.
en relación con los siguientes parámetros en la vista raíz.
https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability
Respuesta gracias a: https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text
Acerca de windowSoftInputMode
fuente
Lo uso cuando ya terminé de actualizar la información del perfil y elimino todo el foco de EditText en mi diseño
====> Actualización: En el contenido del diseño principal, mi EditText agrega la línea:
fuente
¿Qué tal si agregas
android:windowSoftInputMode="stateHidden"
tu actividad en el manifiesto?Tomado de un hombre inteligente que comenta esto: https://stackoverflow.com/a/2059394/956975
fuente
En primer lugar, funcionará al 100% ........
onResume()
método.onResume()
encuentra la vista que se está enfocando una y otra vez porfindViewById()
.onResume()
conjuntorequestFocus()
a esta vista.onResume()
conjuntoclearFocus
a esta vista.focusable
verdadera yfocusableInTuch
verdadera.onResume()
encuentre la vista superior de arriba porfindViewById
onResume()
conjuntorequestFocus()
a esta vista al final.fuente
Intenté deshabilitar y habilitar la capacidad de enfoque para la vista y funcionó para mí (el enfoque se restableció):
fuente
Puede intentar desactivar la capacidad de la actividad principal para guardar su estado (haciendo que olvide qué control tenía texto y qué tenía foco). Necesitará tener alguna otra forma de recordar lo que tienen sus EditText y repoblarlos enResume (). Inicie sus subactividades con startActivityForResult () y cree un controlador onActivityResult () en su actividad principal que actualizará el EditText correctamente. De esta manera, puede establecer el botón adecuado que desea enfocado enResume () al mismo tiempo que repobla el EditText usando un myButton.post (new Runnable () {run () {myButton.requestFocus ();}});
El método View.post () es útil para establecer el enfoque inicialmente porque ese ejecutable se ejecutará después de que se cree la ventana y las cosas se calmen, permitiendo que el mecanismo de enfoque funcione correctamente en ese momento. Intentar establecer el enfoque durante onCreate / Start / Resume () generalmente tiene problemas, he encontrado.
Tenga en cuenta que este es un pseudocódigo y no se ha probado, pero es una posible dirección que podría intentar.
fuente
Agréguelos a su ViewGroup que incluye su EditTextView. Funciona correctamente para mi diseño de restricción. Espero que esto ayude
fuente
Pruebe lo siguiente (llamando
clearAllEditTextFocuses();
)fuente