Suporte à navegação com o teclado

Experimente trabalhar com o Compose
O Jetpack Compose é o kit de ferramentas de IU recomendado para Android. Saiba como usar o toque e a entrada no Compose.

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 um modo conveniente para entrada de texto e 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 são populares, e muitos usuários gostam de conectar acessórios de teclado a eles.

Como mais dispositivos Android oferecem esse tipo de experiência, é importante otimizar o app para oferecer suporte à interação por 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 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, 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 existente e clique em Clone.
    2. Na janela exibida, verifique se as opções Keyboard e DPad estão ativadas.
  2. Para testar o app, use apenas a tecla Tab para navegar pela sua interface. Verifique se cada controle da interface recebe o foco conforme o esperado.

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

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

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

Se você encontrar instâncias em que a navegação com a tecla Tab ou os controles de direção não fazem o que você espera, especifique onde o foco precisa estar no 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 ao lado direito, 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 android:nextFocusForward atributo.

<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 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 se comportam 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 focalizada em uma determinada direção com base no layout das visualizações na tela. No entanto, às vezes o sistema adivinha errado.

Se o sistema não passar o foco para a visualização apropriada 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. Isso é mostrado no exemplo a seguir:

<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: