Red de conocimiento informático - Computadora portátil - Análisis del enfoque en aplicaciones móviles de Android

Análisis del enfoque en aplicaciones móviles de Android

Simple y fácil de entender, en las aplicaciones móviles, el foco es la ubicación actual del evento que se está procesando. En las aplicaciones móviles, es más probable que EditText utilice el foco. Si hay varios EditText en la misma interfaz, normalmente solo uno puede ingresar contenido al mismo tiempo y EditText obtendrá el foco.

En Android, existen dos tipos de configuraciones de enfoque, TouchMode y no TouchMode. Los teléfonos móviles actuales son básicamente pantallas táctiles y usamos los dedos para tocar la pantalla en el modo TouchMode para operar aplicaciones de Android. Además del TouchMode, también existe un modo sin TouchMode, que utiliza un dispositivo externo para operar la aplicación. Además del TouchMode, también existe el modo no TouchMode, que utiliza un dispositivo externo para operar la aplicación. Por ejemplo, teclado. Al usar el emulador Genymotion, cuando hay varios controles en la interfaz, puede usar la tecla Tab de la computadora para moverse y el control seleccionado se resaltará. Este es el modo no táctil y el control seleccionado recibirá el foco.

En las aplicaciones móviles, el enfoque no se usa mucho, pero en las aplicaciones de TV, es necesario usar el control remoto para operar el control seleccionado y luego manejar el enfoque. Los métodos comúnmente utilizados con respecto al enfoque son los siguientes:

En la clase View, isFocusable() e isFocusableInTouchMode() devuelven falso, lo que significa que los controles que heredan directamente de View no pueden obtener el enfoque. Estos métodos se anulan en nuestros controles comunes, como EditText (ambos métodos son verdaderos) y Botón (solo isFocusable() devuelve verdadero), por lo que podemos resaltar botones en las pestañas, pero no en las pestañas. Pero no cuando usamos clics del mouse. (simulando tacto). Si desea que un botón se resalte cuando se hace clic en él, deberá configurar manualmente setFocusableInTouchMode(true) para poder hacerlo.

Si desea escuchar el estado de enfoque del control, debe configurar setOnFocusChangeListener(), que llamará al método onFocusChange cuando el estado de enfoque del control cambie (gane o pierda enfoque).

Con respecto al movimiento del enfoque, el algoritmo predeterminado encontrará el elemento más cercano (elemento que no sea TouchMode) que pueda enfocarse en la dirección especificada. (

El algoritmo predeterminado es encontrar el elemento más cercano (elemento que no sea TouchMode) que pueda enfocarse en la dirección especificada. Alternativamente, puede especificar la dirección para encontrar el foco cuando crea el control agregando nextFocusDown , nextFocusLeft, los valores de nextFocusRight y nextFocusUp se establecen en el elemento especificado. Aquí hay un ejemplo:

Esto especificará que cuando el botón de arriba busque el foco, el siguiente elemento es el elemento con. id inferior, lo que significa que si el botón de arriba continúa presionando la tecla arriba después de obtener el foco, el sistema moverá el foco al elemento con id inferior en lugar de continuar hacia arriba

En el proceso de desarrollo. En las aplicaciones móviles, no hay mucho procesamiento de foco. Este es un sistema diferente al de los eventos, y el foco y los eventos generalmente son independientes entre sí y no entran en conflicto. Sin embargo, hay un pequeño problema en el evento de clic del botón si configuramos setFocusableInTouchMode. (verdadero) en el botón. Obtenga el foco, luego, cuando hagamos clic en el botón, el método onClick() no se ejecutará en el primer clic, pero onFocusChange() se ejecutará solo en el segundo clic y consumirá el evento de clic. pero no es así.

Cuando miramos el código fuente, este problema es claro:

El método onClick() se llama en ACTION_UP de onTouchEvent, verifique el método onTouchEvent de Ver:

Puedes ver que onClick se ejecutará solo cuando focusTaken sea falso. Cuando se ejecuta onClick, el valor de focusTaken por defecto es falso, pero cuando isFocusable() && isFocusableInTouchMode() && ! La clave es isFocused(). Si el botón actual no tiene foco, isFocused() devuelve falso. Cuando !isFocused() es verdadero, el botón obtendrá el foco, lo que hará que focusTaken sea verdadero y el método onClick no lo será. ejecutado.