除了软输入法(如屏幕键盘)之外,Android 还支持连接到设备的物理键盘。键盘提供了一种方便的文本输入模式,以及用户导航和与您的应用交互的方式。尽管大多数手持设备(如手机)使用触摸作为主要交互模式,但平板电脑和类似设备很受欢迎,并且许多用户喜欢将键盘配件连接到它们。
随着越来越多的 Android 设备提供这种体验,优化您的应用以支持通过键盘进行交互非常重要。本文档介绍了如何使用键盘改进导航。
测试您的应用
用户可能已经能够使用键盘导航您的应用,因为 Android 系统默认启用了大多数必要的行为。
Android 框架提供的所有交互式小部件(例如Button
和EditText
)都可聚焦。这意味着用户可以使用控制设备(如方向键或键盘)进行导航,并且每个小部件在获得输入焦点时都会发光或以其他方式更改其外观。
要测试您的应用,请执行以下步骤
- 将您的应用安装在提供硬件键盘的设备上。
如果您没有带有键盘的硬件设备,请连接蓝牙键盘或 USB 键盘。
您还可以使用 Android 模拟器
- 在 AVD 管理器中,单击新建设备或选择现有配置文件并单击克隆。
- 在出现的窗口中,确保启用了键盘和方向键。
- 要测试您的应用,请仅使用Tab键导航您的 UI。确保每个 UI 控件按预期获得焦点。
查找焦点以意外方式移动的任何实例。
- 从应用的开头重新开始,并使用键盘上的方向控制键(如箭头键)导航您的 UI。在 UI 中的每个可聚焦元素中,按Up、Down、Left和Right。
查找焦点以意外方式移动的任何实例。
如果您遇到使用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
。
处理方向导航
用户还可以使用键盘上的箭头键导航您的应用,这与使用方向键或轨迹球导航时的行为相同。系统会根据屏幕上视图的布局提供对哪个视图在给定方向上获得焦点的“最佳猜测”。但是,有时系统的猜测是错误的。
如果系统在给定方向上导航时没有将焦点传递到相应的视图,请使用以下属性指定哪个视图必须接收焦点
每个属性都指定用户在该方向导航时接收焦点的下一个视图,如视图 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" ... />
其他资源
请参阅以下相关资源