¿Cómo eliminar el foco sin configurar el foco a otro control?

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 TableRow s, cada uno con un control EditText de solo lectura y no enfocable y luego un botón a la derecha. Cada botón comienza la misma actividad pero con un argumento diferente. El usuario hace una selección allí y la EditText 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:

  1. Cuando se hace clic en un botón, retire inmediatamente el foco sin configurar el foco en un botón diferente
  2. 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 onCreate() vuelva, pero por alguna razón no funciona en onCreate() la actividad onCreate() .

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.

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:

  

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.

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(); 
  1. Puede usar View.clearFocus() .

  2. Use View.requestFocus() invocado desde onResume() .

  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" 

¿Qué tal si solo android:windowSoftInputMode="stateHidden" en tu actividad en el manifiesto.

Tomado de un hombre inteligente que comenta sobre esto: https://stackoverflow.com/a/2059394/956975

En primer lugar, funcionará al 100% ……..

  1. Crear el método onResume() .
  2. Dentro de este onResume() encuentra la vista que se enfoca una y otra vez mediante findViewById() .
  3. Dentro de este onResume() establece requestFocus() a esta vista.
  4. Dentro de este onResume() establezca clearFocus en esta vista.
  5. Vaya en xml del mismo diseño y encuentre esa vista superior que desea enfocar y establecer focusable verdadera y focusableInTuch . Es muy cierta.
  6. Dentro de este onResume() encuentra la vista superior de arriba por findViewById
  7. Dentro de este onResume() establece requestFocus() a esta vista como último.
  8. Y ahora disfruta ……

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); 

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.

 android:focusableInTouchMode="true" android:focusable="true" android:clickable="true" 

Agréguelos a su ViewGroup que incluye su EditTextView. Funciona correctamente a mi Diseño de Restricción. Espero que esto ayude