支持键盘导航

除了屏幕键盘等软输入法之外,Android 还支持连接到设备的物理键盘。键盘提供了便捷的文本输入模式,以及可让用户浏览应用并与应用互动的方式。虽然大多数手持设备(如手机)都使用触摸作为主要互动模式,但平板电脑和类似设备非常受欢迎,并且许多用户喜欢将键盘配件连接到它们上。

随着越来越多的 Android 设备提供这种体验,您必须优化应用以支持通过键盘进行互动。本文档介绍了如何使用键盘改进导航体验。

测试应用

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

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

如需测试您的应用,请按以下步骤操作:

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

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

    您也可以使用 Android 模拟器:

    1. 在 AVD 管理器中,点击 New Device,或选择现有配置文件并点击 Clone
    2. 在随即显示的窗口中,确保 KeyboardDPad 已启用。
  2. 要测试应用,请仅使用 Tab 键在界面中导航。确保每个界面控件都按预期获得焦点。

    查找焦点以非预期方式移动的所有情况。

  3. 从应用的开头重新开始,并使用方向控件(如键盘上的箭头键)在界面中导航。从界面中的每个可聚焦元素中,按向上向下向左向右

    查找焦点以非预期方式移动的所有情况。

如果您遇到使用 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 依次移至 button2editText1,而是根据屏幕上的外观相应地移动:从 button1 移至 editText1,然后再从 button2 移动。

处理方向导航

用户还可以使用键盘上的箭头键在您的应用中导航,这些键的行为方式与使用方向键或轨迹球进行导航时相同。系统会根据屏幕上的视图布局,提供“最佳猜测”结果,从而确定要在给定方向上聚焦哪个视图。不过,系统有时会出错。

如果系统在指定方向导航时未将焦点传递到相应的视图,请使用以下属性指定哪个视图必须获得焦点:

每个属性都指定当用户沿该方向导航时下一个获得焦点的视图(由视图 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"
    ...  />

其他资源

请参阅以下相关资源: