支持可拆卸键盘有助于最大限度地提高用户在大屏设备上的工作效率。每当键盘连接到设备或从设备断开连接时,Android 都会触发配置变更,这可能会导致界面状态丢失。您的应用可以保存和恢复其状态,让系统处理 activity 重新创建,也可以限制 activity 重新创建以应对键盘配置更改。
在所有情况下,与键盘相关的所有数据都存储在 Configuration 对象中。配置对象的 keyboard 和 keyboardHidden 字段包含有关键盘类型及其可用性的信息。
最佳做法
针对大屏设备优化的应用支持各种类型的输入设备,从软件和硬件键盘到触控笔、鼠标、触控板和其他外围设备。
对外部键盘的支持涉及配置更改,您可以通过以下两种方式管理这些更改:
- 让系统重新创建正在运行的 activity,而您负责管理应用的状态。
- 自行管理配置变更(系统不会重新创建 activity):
- 声明所有与键盘相关的配置值
- 创建配置更改处理程序
对于需要精细控制界面以进行文本输入和其他输入的效率类应用,自行处理配置更改的方法会很有用。
在特殊情况下,您可能希望在连接或断开硬件键盘时更改应用布局,例如,为工具或编辑窗口腾出更多空间。
在 Jetpack Compose 中,您可以通过以下两种方式对键盘配置变更做出响应:
- 响应式界面:使用
LocalConfiguration.current在可组合项中直接读取当前配置状态。当键盘连接或断开连接时,界面会自动重新组合以适应新状态。 - 副作用回调:使用可感知生命周期的
DisposableEffect在宿主 activity 上注册配置更改监听器,这样您就可以触发非界面事件(例如日志记录或分析),而无需重新创建 activity 或实例化任何虚拟视图元素。
所需要素
android:configChanges:应用清单的<activity>元素的属性。告知系统应用管理的配置更改。LocalConfiguration:可组合的本地提供程序,用于公开当前设备的Configuration。DisposableEffect:一种 Compose 副作用 API,用于在可组合项进入组合时运行代码块,并在可组合项离开组合时进行清理。
步骤
声明 configChanges 属性并添加与键盘相关的值,以防止 activity 重新创建。然后,使用 LocalConfiguration.current 动态调整可组合函数的布局,或使用 DisposableEffect 注册配置监听器。
1. 声明 configChanges 属性
通过将 keyboard|keyboardHidden 值添加到已管理的配置更改列表中,更新应用清单中的 <activity> 元素:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. 响应键盘配置更改
如需在 Jetpack Compose 中处理配置更改,请使用以下选项之一,具体取决于您是更新界面还是执行副作用回调:
选项 A:反应式界面(推荐)
直接从
LocalConfiguration.current读取键盘类型。当硬件键盘连接或断开连接时,此值会发生变化,并且 Compose 会自动重新组合界面。val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
选项 B:副作用监听器
如果需要在配置更改时运行副作用(例如记录日志、更新本地数据库或触发分析),请使用
DisposableEffect在宿主ComponentActivity上注册配置更改监听器。val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
结果
现在,您的应用在连接或断开外接键盘时,无需重新创建正在运行的 activity 即可做出响应。
其他资源
如需了解如何在配置更改(例如键盘连接或断开连接)期间保存应用的界面状态,请参阅保存界面状态。