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

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

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

Проверьте свое приложение

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

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

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

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

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

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

    1. В диспетчере AVD либо нажмите «Новое устройство» , либо выберите существующий профиль и нажмите «Клонировать» .
    2. В появившемся окне убедитесь, что клавиатура и 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"
    ...  />

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

Обратитесь к следующим соответствующим ресурсам: