Neste post vou escrever sobre um assunto que achei bem interessante com relação ao que conhecemos como “foco”. É muito comum em aplicações desktop ter se a preocupação em tratar o posicionamento do “foco” nos controles de uma janela e tratar os eventos relacionados ao “foco”. No Android como existem diversos tipos de aparelhos que permitem uma navegação diferenciada de acordo com o hardware, torna-se necessário conhecer melhor como é o funcionamento do “foco” em aparelhos com tela touch screen, com trackball ou com teclado.
O Android tem uma funcionalidade chamada de Touch Mode. Esta funcionalidade foi criada para diferenciar a forma como um widget é exibido no momento em que é pressionado ou selecionado, seja com um clique através da tela touchscreen ou através do teclado ou um trackball.
Quando um widget é selecionado através da tela touchscreen o Android entre automaticamente em modo Touch Mode e fica neste modo até que uma tecla de navegação ou um trackball seja acionado, fazendo com que o Android saia do modo TouchMode.
Portanto o framework do Android reconhece automaticamente quando um widget é acionado através da tela touchscreen ou através do teclado.
No caso em que o dispositivo esteja em Touch Mode (quando o usuário utiliza a tela touchscreen) os widgets não apresentam o “foco”ou indicação de estarem selecionados. A exceção a esta regra são os widgets que possuem o atributo android:focusableinTouchMode setado como true, como por exemplo o EditText, o ListView quando está configurado para trabalhar com filtro. Neste caso o widget que permite a digitação de texto aparece com foco no local onde o texto vai ser inserido.
Quando um widget é selecionado através da tela touch screen não existe uma dúvida de qual widget foi selecionado, por isso alguns widgets simplesmente respondem ao evento sem dar qualquer indicação na tela, por exemplo button, checkbox, radion button.
No caso do usuário estar utilizando o teclado para navegar ou um trackball, os widgets recebem foco e permanecem selecionados para que fique visível o item selecionado.
Uma situação que causa confusão é quando o usuário seleciona um widget através do teclado, este widget recebe foco, quando o usuário toca a tela, o widget perde o foco e só retorna a ter o foco quando a tecla de navegação é acionada novamente. Isto ocorre porque o dispositivo muda de modo de operação de Touch Mode para não Touch Mode.
Para saber se a aplicação está em modo Touch Mode utilize o método isInTouchMode() da classe View.
View.isInTouchMode()
Quando uma aplicação que possui um ListView e está em modo Touch Mode não é possível obter o item selecionado através do método ListView.getSelectedItemPosition(). Neste caso o método vai retornar INVALID_POSITION. O método só vai retornar a posição do item selecionado se não estiver no modo Touch Mode. Para resolver este problema utilize o click listener da View.
No momento de desenvolver a interface de uma aplicação deve-se levar em consideração a utilização da aplicação e lembrar o padrão de funcionamento do framework. Não desenvolver a aplicação baseando-se em foco e seleção.