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 modo principal de interação, tablets e dispositivos semelhantes são muito usados, 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 suporte à interação por meio de um teclado. Este documento descreve como melhorar a navegação com um teclado.

Testar o app

Os usuários podem já conseguir navegar no seu app usando um teclado, porque o sistema Android permite 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 cada widget brilha ou muda de aparência quando recebe 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 tiver um dispositivo de hardware com teclado, conecte um teclado Bluetooth ou um teclado 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 IU. Certifique-se de que cada controle de interface esteja recebendo o foco conforme esperado.

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

  3. Comece novamente desde o início do app e navegue pela IU usando controles de direção, como as teclas de seta do teclado. Em cada elemento focalizável na sua IU, pressione Para cima, Para baixo, Esquerda e Direita.

    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 faz o esperado, 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 pelo 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 abaixo, 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 um dos elementos focáveis 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 mudar 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 em um teclado, que se comportam da mesma forma que na navegação com um botão direcional ou trackball. O sistema fornece um "melhor palpite" para 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 supõe errado.

Se o sistema não transmitir o foco para a visualização adequada ao navegar em uma determinada direção, especifique qual visualização precisa receber foco com estes 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 neste 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"
    ...  />

Outros recursos

Confira estes recursos relacionados: