¿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 :
- Diferencia entre `focusable` y` clickable`
- Android: cambia TextView textColor cuando el padre está enfocado
- Aparición automática de teclado en el inicio Actividad
- Android: cambia el estilo cuando se enfoca
- Cómo agregar "Siguiente" en el teclado android
¿Y cómo son diferentes de isFocusable
y isFocusableInTouchMode
?
- Navegación por teclado con Android GridView no se desplaza por la cuadrícula
- Cámara Android centrada sólo una vez
- Cómo obtener GridView desplazarse a la parte superior con el teclado en Android TV
- Android, Admob / Adview toma | se roba el foco de edittext, ¿Cómo prevenir?
- Obtener el hijo que el último se centró
- Gestionar el enfoque en una vista personalizada
- Cómo mantener el cajón deslizante de la parte superior del teclado virtual
- ¿Cómo obtener el objeto de vista de enfoque actual en Service?
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.
- DialogFragment no cambia el tamaño cuando se muestra el teclado
- Java.lang.IllegalStateException: Sin actividad