android - reparar - ¿Cómo eliminar el foco sin configurar el foco a otro control?
programacion android pdf 2018 (8)
Puede usar
View.clearFocus()
.Use
View.requestFocus()
invocado desdeonResume()
.
Me gusta que mis UI sean intuitivas; cada pantalla debe guiar de forma natural y discreta al usuario en el siguiente paso de la aplicación. Salvo eso, me esfuerzo por hacer que las cosas sean tan confusas y confusas como sea posible.
Es una broma :-)
Tengo tres TableRows, cada una conteniendo un control EditText de solo lectura y no enfocable y luego un botón a su derecha. Cada botón comienza la misma actividad pero con un argumento diferente. El usuario hace una selección allí y la subactividad termina, completando el EditText apropiado con la selección del usuario.
Es el mecanismo clásico de valores en cascada; cada selección reduce las opciones disponibles para la próxima selección, etc. Por lo tanto, deshabilitaré ambos controles en cada una de las siguientes filas hasta que EditText en la fila actual contenga un valor.
Necesito hacer una de estas dos cosas, en este orden de preferencia:
- Cuando se hace clic en un botón, retire inmediatamente el foco sin configurar el foco 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 la subactividad vuelve; el botón en el que se hizo clic retiene el foco.
Re: # 1 arriba - No parece haber un método removeFocus (), o algo similar
Ref .: n. ° 2 anterior: puedo usar requestFocus () para establecer el foco en el botón de la fila siguiente, y eso funciona después de que la subactividad vuelva, pero por alguna razón no funciona en onCreate () de la actividad principal.
Necesito consistencia UI en cualquier dirección: o bien ningún botón tiene foco después de que finaliza la subactividad o cada botón recibe enfoque dependiendo de su lugar en el flujo lógico, incluido el primer (y único) botón activo antes de cualquier selección.
¿Qué tal si solo android:windowSoftInputMode="stateHidden"
en tu actividad en el manifiesto.
Tomado de un hombre inteligente que comenta sobre esto: https://.com/a/2059394/956975
El uso de clearFocus () tampoco me funcionaba como lo encontraste (vi en los comentarios a otra respuesta), pero lo que funcionó para mí al final fue agregar:
<LinearLayout
android:id="@+id/my_layout"
android:focusable="true"
android:focusableInTouchMode="true" ...>
a mi vista de diseño de nivel superior (un diseño lineal). Para eliminar el enfoque de todos los botones / EditTexts, etc., puede hacer
LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();
Solicitar foco no hizo nada a menos que configure la vista para que sea enfocable.
En primer lugar, funcionará al 100% ........
- Crear el método
onResume()
. - Dentro de este
onResume()
encuentra la vista que se enfoca una y otra vez mediantefindViewById()
. - Dentro de este
onResume()
establecerequestFocus()
a esta vista. - Dentro de este
onResume()
establezcaclearFocus
en esta vista. - Vaya en xml del mismo diseño y encuentre esa vista superior que desea enfocar y establecer
focusable
verdadera yfocusableInTuch
. Es muy cierta. - Dentro de este
onResume()
encuentra la vista superior de arriba porfindViewById
- Dentro de este
onResume()
establecerequestFocus()
a esta vista como último. - Y ahora disfruta ......
Podría intentar desactivar la capacidad de la actividad principal para guardar su estado (lo que le haría olvidar qué control tenía texto y qué tenía foco). Tendrá que tener alguna otra forma de recordar lo que tiene su EditText y repoblarlos en Resume (). Inicie sus subactividades con startActivityForResult () y cree un controlador onActivityResult () en su actividad principal que actualizará correctamente el EditText. De esta forma, puede establecer el botón correcto que desea enfocar en Reanudar () al mismo tiempo que vuelve a llenar el texto de EditText mediante un myButton.post (nuevo Runnable () {run () {myButton.requestFocus ();}});
El método View.post () es útil para establecer el foco 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. Tratar de establecer el foco durante onCreate / Start / Resume () generalmente tiene problemas, he encontrado.
Tenga en cuenta que esto es pseudocódigo y no probado, pero es una dirección posible que podría intentar.
Traté de desactivar y habilitar la capacidad de enfoque para ver y funcionó para mí (se reinició el enfoque):
focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);
Una vieja pregunta, pero la encontré cuando tuve un problema similar y pensé que compartiría lo que terminé haciendo.
La vista que ganó el foco fue diferente cada vez, así que utilicé la muy genérica:
View current = getCurrentFocus();
if (current != null) current.clearFocus();
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();
Utilizo esto cuando ya terminé la información del perfil de actualización y eliminé todo el enfoque de EditText en mi diseño
====> Actualización: en el contenido de diseño principal, mi línea EditText agrega:
android:focusableInTouchMode="true"