支持键盘导航

除了软键盘输入法(例如屏幕键盘)之外,Android 还支持连接到设备的物理键盘。键盘不仅是一种便捷的文本输入方式,还使用户能够在应用中导航并与应用互动。虽然大多数手持设备(如手机)都以轻触为主要互动模式,但随着平板电脑和类似设备越来越受欢迎,很多用户喜欢连接键盘配件。

鉴于越来越多的 Android 设备提供这种体验,您很有必要优化应用以支持通过键盘进行互动。本节课介绍如何更好地支持使用键盘进行导航。

注意:对于确保不使用视觉提示进行导航的用户可访问您的应用,在应用中支持方向导航也很重要。在您的应用中全面支持方向导航还可帮助您使用 uiautomator 等工具自动执行界面测试

请参阅以下相关资源:

测试应用

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

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

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

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

    如果您没有带键盘的硬件设备,请连接蓝牙键盘或 USB 键盘(但并非所有设备都支持 USB 配件)。

    您也可以使用 Android 模拟器:

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

    查找焦点不按预期移动的任何情况。

  3. 从应用的开头开始,改用方向控件(键盘上的箭头键)在应用中导航。

    从界面中的每个可设置为焦点的元素,按上、下、左、右四个箭头键。

    查找焦点不按预期移动的任何情况。

如果您遇到在使用 Tab 键或方向控件进行导航时没有达到预期效果的情况,请指定焦点应在布局中停留的位置,如以下部分所述。

处理 Tab 键导航

当用户使用键盘 Tab 键在应用中导航时,系统会根据元素在布局中的显示顺序在元素之间传递输入焦点。例如,如果您使用相对布局,且屏幕上元素的顺序与文件中的顺序不同,您可能需要手动指定焦点顺序。

例如,在以下布局中,两个按钮对齐到右侧,文本字段对齐到第二个按钮的左侧。如需将焦点从第一个按钮传递到文本字段,再传递到第二个按钮,布局需要使用 android:nextFocusForward 属性明确定义每个可聚焦元素的焦点顺序:

    <RelativeLayout ...>
        <Button
            android:id="@+id/button1"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:nextFocusForward="@+id/editText1"
            ... />
        <Button
            android:id="@+id/button2"
            android:layout_below="@id/button1"
            android:nextFocusForward="@+id/button1"
            ... />
        <EditText
            android:id="@id/editText1"
            android:layout_alignBottom="@+id/button2"
            android:layout_toLeftOf="@id/button2"
            android:nextFocusForward="@+id/button2"
            ...  />
        ...
    </RelativeLayout>
    

现在,焦点会根据屏幕上的显示正确移动,从 button1editText1 再到 button2,而不是将焦点从 button1 发送到 button2 再到 editText1

处理方向导航

用户还可以使用键盘上的箭头键在应用中导航(行为方式与使用方向键或轨迹球导航时相同)。 系统会根据屏幕上视图的布局,对在指定方向上哪个视图应获得焦点做出最佳猜测。不过,有时系统可能会猜错。

如果系统在指定方向上导航时没有将焦点传递到合适的视图,请使用以下属性指定哪个视图应获得焦点:

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