支持键盘导航

试试 Compose 方式
Jetpack Compose 是 Android 推荐的 UI 工具包。了解如何在 Compose 中使用触摸和输入。

除了软输入法(例如屏幕键盘)之外,Android 还支持连接到设备的物理键盘。键盘为文本输入提供了便捷模式,也为用户导航和与应用交互提供了一种方式。虽然大多数手持设备(如手机)主要使用触摸进行交互,但平板电脑及类似设备也很受欢迎,许多用户喜欢为其连接键盘配件。

随着越来越多搭载 Android 系统的设备提供这种体验,优化您的应用以支持通过键盘进行交互非常重要。本文档介绍了如何通过键盘改善导航体验。

测试您的应用

用户可能已经能够使用键盘导航您的应用,因为 Android 系统默认启用了大多数必要的行为。

Android 框架提供的所有交互式小部件(例如 ButtonEditText)都可获得焦点。这意味着用户可以使用方向键或键盘等控制设备进行导航,并且每个小部件在获得输入焦点时都会发光或以其他方式改变外观。

要测试您的应用,请执行以下步骤

  1. 在提供物理键盘的设备上安装您的应用。

    如果您没有带键盘的物理设备,请连接蓝牙键盘或 USB 键盘。

    您也可以使用 Android 模拟器

    1. 在 AVD Manager 中,点击 New Device 或选择现有配置文件并点击 Clone
    2. 在出现的窗口中,确保 KeyboardDPad 已启用。
  2. 要测试您的应用,仅使用 Tab 键在 UI 中导航。确保每个 UI 控件都按预期获得焦点。

    查找焦点以意外方式移动的任何实例。

  3. 从应用的开头再次开始,使用方向控制(例如键盘上的箭头键)在 UI 中导航。从 UI 中的每个可获得焦点元素,按 UpDownLeftRight

    查找焦点以意外方式移动的任何实例。

如果您遇到使用 Tab 键或方向控制导航与预期不符的情况,请指定焦点在布局中的位置,如下面各节所述。

处理 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

处理方向导航

用户还可以使用键盘上的箭头键导航您的应用,这与使用方向键或轨迹球导航的行为相同。系统会根据 View 在屏幕上的布局,“最佳猜测”在给定方向上将焦点赋给哪个 View。但是,有时系统会猜错。

如果系统在给定方向上导航时没有将焦点传递给适当的 View,请使用以下属性指定哪个 View 必须接收焦点

每个属性都指定了用户在该方向上导航时接收焦点的下一个 View,具体由 View ID 指定。以下示例对此进行了演示

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

其他资源

请参阅以下相关资源