Поддержка навигации с помощью клавиатуры

Попробуйте Compose
Jetpack Compose – это рекомендуемый набор инструментов для создания пользовательского интерфейса в Android. Узнайте, как использовать сенсорный ввод и ввод данных в Compose.

Помимо экранных клавиатур, Android поддерживает физические клавиатуры, подключенные к устройству. Клавиатура – это удобный способ ввода текста, навигации и взаимодействия с приложением. Хотя на большинстве портативных устройств, например телефонах, основным способом взаимодействия является сенсорный экран, планшеты и подобные устройства также популярны, и многие пользователи подключают к ним клавиатуру.

Поскольку все больше устройств Android поддерживают такой режим, важно оптимизировать приложение для работы с клавиатурой. В этой статье рассказывается, как улучшить навигацию с помощью клавиатуры.

Тестирование приложения

Возможно, пользователи уже могут перемещаться по вашему приложению с помощью клавиатуры, поскольку система Android по умолчанию включает большинство необходимых функций.

Все интерактивные виджеты, предоставляемые фреймворком Android, такие как Button и EditText, поддерживают фокус. Это означает, что пользователи могут перемещаться с помощью устройств управления, таких как d-pad или клавиатура, и каждый виджет светится или иным образом меняет свой внешний вид, когда он получает фокус ввода.

Чтобы протестировать приложение, выполните следующие действия:

  1. Установите приложение на устройство с аппаратной клавиатурой.

    Если у вас нет устройства с клавиатурой, подключите клавиатуру Bluetooth или USB.

    Вы также можете использовать эмулятор Android:

    1. В Менеджере AVD нажмите New Device (Новое устройство) или выберите существующий профиль и нажмите Clone (Клонировать).
    2. В открывшемся окне убедитесь, что включены параметры Keyboard (Клавиатура) и DPad (Кнопки со стрелками).
  2. Чтобы протестировать приложение, используйте только клавишу Tab для навигации по интерфейсу. Убедитесь, что фокус перемещается на каждый элемент управления пользовательского интерфейса.

    Обратите внимание на случаи, когда фокус перемещается неожиданным образом.

  3. Вернитесь в начало приложения и перемещайтесь по интерфейсу с помощью клавиш со стрелками на клавиатуре. Нажмите Вверх, Вниз, Влево и Вправо на каждом элементе интерфейса, на котором можно установить фокус.

    Обратите внимание на случаи, когда фокус перемещается неожиданным образом.

Если вы обнаружите, что навигация с помощью клавиши Tab или элементов управления направлением работает не так, как ожидалось, укажите, где должен быть фокус в макете, как описано в следующих разделах.

Как управлять навигацией по вкладкам

Когда пользователь перемещается по приложению с помощью клавиши Tab, фокус ввода переходит между элементами в том порядке, в котором они расположены в макете. Если вы используете относительный макет и порядок элементов на экране отличается от порядка в файле, вам может потребоваться вручную указать порядок фокуса.

Например, в следующем макете две кнопки выровнены по правому краю, а текстовое поле – по левому краю второй кнопки. Чтобы фокус переходил с первой кнопки на текстовое поле, а затем на вторую кнопку, в макете нужно явно определить порядок фокусировки для каждого из фокусируемых элементов с помощью атрибута 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>

Теперь фокус перемещается не с button1 на button2, а затем на editText1, а в соответствии с расположением на экране: с button1 на editText1, а затем на button2.

Обработка навигации по направлениям

Пользователи также могут перемещаться по приложению с помощью клавиш со стрелками на клавиатуре, которые работают так же, как и при навигации с помощью d-pad или трекбола. Система предоставляет "наилучшее предположение" о том, какому представлению следует уделить внимание в данном направлении на основе макета представлений на экране. Однако иногда система ошибается.

Если система не передает фокус соответствующему представлению при навигации в заданном направлении, укажите, какое представление должно получить фокус, используя следующие атрибуты:

Каждый атрибут указывает следующее представление, которое получит фокус, когда пользователь перемещается в этом направлении, как указано в идентификаторе представления. Это показано в следующем примере:

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

Дополнительные ресурсы

Ознакомьтесь со следующей информацией по теме: