¿Cuál es la diferencia entre setFocusable y setFocusableInTouchMode?

¿Cuál es la diferencia entre setFocusable y setFocusableInTouchMode para una vista de Android?

Pregunta adicional después de intentar leer la documentación :

¿Y cómo son diferentes de isFocusable y isFocusableInTouchMode ?

SetFocusable se utiliza principalmente para activar / desactivar el evento de enfoque de la vista tanto en el modo táctil como en el modo de teclado (utilizando la tecla arriba / abajo / siguiente).

SetFocusableInTouchMode utilizado principalmente para activar / desactivar el evento de enfoque de la vista en el modo de tacto solo.

Si está desactivado setFocusable , también deshabilita el evento de enfoque de la vista en el modo táctil.

Después de leer la respuesta de @Raj, pasando por la documentación de Android, y experimentando con el código, creo que entiendo cómo funcionan un poco mejor ahora. Aquí hay una pequeña ayuda adicional si alguien más se confunde de manera similar. Avísame si me equivoco.

Las vistas pueden ser enfocadas o desenfocadas. Algunas vistas cambian su apariencia cuando están enfocadas. Esto puede ser especialmente útil cuando se utiliza un teclado para navegar por el diseño. De esta manera usted sabe dónde está antes de hacer clic en una vista. Incluso las vistas que no cambian naturalmente cuando el foco se pueden hacer para hacer tan usando un selector y drawables . Si no está utilizando un teclado para navegar, sin embargo, el enfoque no es tan importante.

Había tres pares de cosas que me confundían:

 isFocusable() isFocusableInTouchMode() setFocusable() setFocusableInTouchMode() requestFocus() requestFocusFromTouch() 

El primer par le indica información sobre la vista. Es decir, si es o no es posible que esa vista sea enfocada. Puedes averiguarlo haciendo algo como esto:

 Boolean b = myView.isFocusable(); 

Está en el modo táctil después de haber tocado la pantalla. Así que algo que puede ser enfocable cuando está utilizando el teclado puede no ser enfocable cuando está usando sus dedos. Puede comprobar de la siguiente manera:

 Boolean b = myView.isFocusableInTouchMode(); 

Como he dicho, esto sólo le dice información acerca de si es incluso posible dar el foco de vista o no. Si realmente quieres darle enfoque a la vista, primero tienes que hacer posible que te enfoques. Puede hacerlo con uno de los siguientes comandos:

 myView.setFocusable(true); myView.setFocusableInTouchMode(true); 

Si está en modo táctil y llama a setFocusableInTouchMode(true) , tanto myView.isFocusable() como myView.isFocusableInTouchMode() devolverán true. No es necesario llamar a los dos. Sin embargo, si sólo llama a myView.setFocusable(true) entonces myView.isFocusableInTouchMode() no se cambiará.

Ahora para finalmente hacer la vista enfocada usted tiene que llamar lo siguiente:

 myView.requestFocus(); 

Todavía no entiendo completamente requestFocusInTouchMode() porque simplemente usando requestFocus() funcionó para mí, pero la documentación dice acerca de requestFocusInTouchMode() :

Llame a esto para tratar de darle enfoque a una vista específica oa uno de sus descendientes. Esta es una variante especial de requestFocus () que permitirá a las vistas que no son focables en modo táctil solicitar el enfoque cuando se tocan.

Por último, cabe señalar que Romain Guy dijo en este post :

Una vista que se puede enfocar en el modo táctil tiene interacciones extrañas ya menos que entiendas perfectamente lo que estás haciendo, no deberías usarlo. RequestFocus () funciona, pero el enfoque se muestra sólo cuando el dispositivo no está en modo táctil. Tan pronto como el usuario toque la pantalla, el enfoque ya no se visualiza. Al hacer lo que está haciendo, está haciendo que su aplicación se comporte de manera diferente del resto del sistema y se arriesga a comportamientos extraños.

  • Establecer el enfoque inicial en una aplicación de Android
  • Foco táctil de la cámara Android
  • Enfoque en movimiento dentro de un FrameLayout
  • ¿Existe una manera eficiente de realizar un enfoque automático "continuo"?
  • Mover el foco de un cuadro de texto Editar a otro
  • ¿Por qué Android TabHost está robando el foco de un TextView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.