Suporte à navegação com o teclado

Além dos métodos de entrada simples, como teclados na tela, o Android oferece suporte a teclados físicos conectados ao dispositivo. Um teclado oferece um modo conveniente para entrada de texto e uma maneira de os usuários navegarem e interagirem com o app. Embora a maioria dos dispositivos portáteis, como smartphones, use o toque como o principal modo de interação, os tablets e dispositivos semelhantes são populares, e muitos usuários gostam de conectar acessórios de teclado a eles.

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

Testar o app

Os usuários já podem navegar no app usando um teclado, porque o sistema Android ativa a maioria dos comportamentos necessários por padrão.

Todos os widgets interativos fornecidos 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, siga este procedimento:

  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.

    Você também pode usar o Android Emulator:

    1. No AVD Manager, clique em New Device ou selecione um perfil e clique em Clone.
    2. Na janela exibida, verifique se as opções Keyboard e DPad estão ativadas.
  2. Para testar seu app, use apenas a tecla Tab para navegar pela interface. Verifique se cada controle da interface recebe o foco conforme esperado.

    Procure instâncias em que o foco se mova de maneira inesperada.

  3. Comece de novo e navegue pela interface usando controles de direção, como as teclas de seta no teclado. Em cada elemento focalizável na interface, pressione Up, Down, Left e Right.

    Procure instâncias 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, talvez seja 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 transmitir 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.

<androidx.constraintlayout.widget.ConstraintLayout ...>
    <Button
        android:id="@+id/button1"
        android:nextFocusForward="@+id/editText1"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        ... />
    <Button
        android:id="@+id/button2"
        android:nextFocusForward="@+id/button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button1"
        ... />
    <EditText
        android:id="@id/editText1"
        android:nextFocusForward="@+id/button2"
        app:layout_constraintBottom_toBottomOf="@+id/button2"
        app:layout_constraintRight_toLeftOf="@id/button2
        ...  />
    ...
</androidx.constraintlayout.widget.ConstraintLayout>

Agora, em vez de o foco se mover de button1 para button2 e depois editText1, ele se move corretamente de acordo com a aparência na tela: de button1 para editText1 e depois button2.

Gerenciar navegação direcional

Os usuários também podem navegar no app usando as teclas de seta do teclado, que funcionam da mesma forma que a navegação com um botão direcional ou trackball. O sistema oferece a "melhor estimativa" de qual visualização deve ser focada em uma determinada direção com base no layout das visualizações na tela. No entanto, às vezes o sistema faz 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 navega nessa direção, conforme especificado pelo ID da visualização. Isso é mostrado no exemplo abaixo:

<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"
    ...  />

Outros recursos

Confira estes recursos relacionados: