Compatibilidade à navegação com o teclado

Além dos métodos de entrada simples (como teclados na tela), o Android é compatível com teclados físicos conectados ao dispositivo. Um teclado oferece não apenas um modo conveniente para entrada de texto, mas também uma maneira de o usuário navegar e interagir com o app. Embora a maioria dos dispositivos portáteis, como smartphones, use o toque como principal modo de interação, tablets e dispositivos semelhantes estão ganhando popularidade, e muitos usuários gostam de conectar acessórios de teclado.

À medida que mais dispositivos Android oferecem esse tipo de experiência, é importante otimizar seu app para oferecer compatibilidade com a interação por meio de um teclado. Esta lição descreve como melhorar a compatibilidade para navegação com teclado.

Observação: a compatibilidade com a navegação direcional no seu aplicativo também é importante para garantir que ele possa ser acessado por usuários que não navegam usando indicações visuais. A compatibilidade total com a navegação direcional no aplicativo também pode ajudar a automatizar testes da interface do usuário com ferramentas como uiautomator.

Confira os seguintes recursos relacionados:

Testar seu app

É possível que os usuários já possam navegar no seu app usando um teclado, porque o sistema Android é compatível com a maioria dos comportamentos necessários por padrão.

Todos os widgets interativos oferecidos pelo framework do Android (como Button e EditText) são focalizáveis. Isso significa que os usuários podem navegar com dispositivos de controle, como um botão direcional ou teclado, e que cada widget brilha ou muda de aparência quando ganha o foco de entrada.

Para testar o app:

  1. Instale seu app em um dispositivo que ofereça um teclado físico.

    Se você não tem um dispositivo de hardware com um teclado, conecte um teclado Bluetooth ou USB (embora nem todos os dispositivos sejam compatíveis com acessórios USB).

    Você também pode usar o Android Emulator:

    1. No AVD Manager, clique em New Device ou selecione um perfil existente e clique em Clone.
    2. Na janela exibida, verifique se as opções Keyboard e DPad estão ativadas para poder usar o teclado ou o botão direcional.
  2. Para testar seu app, use apenas a tecla "Tab" para navegar na IU, garantindo que cada controle dela receba foco conforme esperado.

    Verifique se há qualquer instância em que o foco se mova de maneira inesperada.

  3. Abra seu app e use os controles de direção (teclas de seta no teclado) para navegar nele.

    Em cada elemento focalizável na IU, pressione as teclas de seta para cima, para baixo, para a esquerda e para a direita.

    Verifique se há qualquer instância em que o foco se mova de maneira inesperada.

Se você encontrar alguma instância em que a navegação com a tecla "Tab" ou com os controles de direção não realize a ação esperada, especifique o local onde o foco deve estar no seu layout, conforme discutido nas seções a seguir.

Gerenciar a navegação com a tecla "Tab"

Quando um usuário navega no app usando a tecla "Tab" do teclado, o sistema passa o foco de entrada entre os elementos com base na ordem em que eles aparecem no layout. Se você usar um layout relativo, por exemplo, e a ordem dos elementos na tela for diferente da ordem no arquivo, poderá ser necessário especificar manualmente a ordem de foco.

Por exemplo, no layout a seguir, dois botões estão alinhados à direita e um campo de texto está alinhado à esquerda do segundo botão. Para passar o foco do primeiro botão para o campo de texto e depois para o segundo botão, o layout precisa definir explicitamente a ordem de foco de cada elemento focalizável com o atributo android:nextFocusForward:

    <RelativeLayout ...>
        <Button
            android:id="@+id/button1"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:nextFocusForward="@+id/editText1"
            ... />
        <Button
            android:id="@+id/button2"
            android:layout_below="@id/button1"
            android:nextFocusForward="@+id/button1"
            ... />
        <EditText
            android:id="@id/editText1"
            android:layout_alignBottom="@+id/button2"
            android:layout_toLeftOf="@id/button2"
            android:nextFocusForward="@+id/button2"
            ...  />
        ...
    </RelativeLayout>
    

Agora, em vez de enviar foco de button1 para button2 e depois para editText1, o foco se move corretamente de acordo com a exibição na tela: de button1 para editText1 e depois para button2.

Gerenciar navegação direcional

Os usuários também podem navegar no seu app usando as teclas de seta do teclado (o comportamento é igual ao da navegação com um botão direcional ou trackball). O sistema oferece a melhor estimativa de qual visualização deve ser focalizada em uma determinada direção com base no layout das visualizações na tela. Às vezes, no entanto, o sistema pode fazer uma estimativa incorreta.

Se o sistema não passar o foco para a visualização correta ao navegar em uma determinada direção, especifique qual visualização precisa receber o foco com os seguintes atributos:

Cada atributo designa a próxima visualização a receber o foco quando o usuário navegar nessa direção, conforme especificado pelo ID da visualização. Por exemplo:

    <Button
        android:id="@+id/button1"
        android:nextFocusRight="@+id/button2"
        android:nextFocusDown="@+id/editText1"
        ... />
    <Button
        android:id="@id/button2"
        android:nextFocusLeft="@id/button1"
        android:nextFocusDown="@id/editText1"
        ... />
    <EditText
        android:id="@id/editText1"
        android:nextFocusUp="@id/button1"
        ...  />