除了软输入法(例如屏幕键盘)之外,Android 还支持连接到设备的物理键盘。键盘为文本输入提供了便捷模式,也为用户导航和与应用交互提供了一种方式。虽然大多数手持设备(如手机)主要使用触摸进行交互,但平板电脑及类似设备也很受欢迎,许多用户喜欢为其连接键盘配件。
随着越来越多搭载 Android 系统的设备提供这种体验,优化您的应用以支持通过键盘进行交互非常重要。本文档介绍了如何通过键盘改善导航体验。
测试您的应用
用户可能已经能够使用键盘导航您的应用,因为 Android 系统默认启用了大多数必要的行为。
Android 框架提供的所有交互式小部件(例如 Button
和 EditText
)都可获得焦点。这意味着用户可以使用方向键或键盘等控制设备进行导航,并且每个小部件在获得输入焦点时都会发光或以其他方式改变外观。
要测试您的应用,请执行以下步骤
- 在提供物理键盘的设备上安装您的应用。
如果您没有带键盘的物理设备,请连接蓝牙键盘或 USB 键盘。
您也可以使用 Android 模拟器
- 在 AVD Manager 中,点击 New Device 或选择现有配置文件并点击 Clone。
- 在出现的窗口中,确保 Keyboard 和 DPad 已启用。
- 要测试您的应用,仅使用 Tab 键在 UI 中导航。确保每个 UI 控件都按预期获得焦点。
查找焦点以意外方式移动的任何实例。
- 从应用的开头再次开始,使用方向控制(例如键盘上的箭头键)在 UI 中导航。从 UI 中的每个可获得焦点元素,按 Up、Down、Left 和 Right。
查找焦点以意外方式移动的任何实例。
如果您遇到使用 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" ... />
其他资源
请参阅以下相关资源