可拆卸键盘管理

三星评级图标

支持可拆卸键盘有助于最大限度地提高用户在大屏设备上的工作效率。每当键盘连接到设备或从设备断开连接时,Android 都会触发配置更改,这可能会导致界面状态丢失。您的 应用可以保存和恢复其状态,让 系统处理 activity 重新创建,也可以 限制 activity 重新创建以进行键盘 配置更改。

在所有情况下,与键盘相关的所有数据都存储在 Configuration 对象中。配置对象的 keyboardkeyboardHidden 字段包含有关键盘类型及其可用性的信息。

最佳做法

针对大屏设备优化的应用支持各种类型的输入设备,从软件和硬件键盘到触控笔、鼠标、触控板和其他外围设备。

对外部键盘的支持涉及配置更改,您可以通过以下两种方式之一进行管理:

  1. 让系统重新创建正在运行的 activity,并由您负责管理应用的状态。
  2. 自行管理配置更改(不会重新创建 activity):
    • 声明所有与键盘相关的配置值
    • 创建配置更改处理程序

对于需要对界面进行精细控制以进行文本输入和其他输入的操作效率应用,自行处理配置更改的方法会很有用。

在特殊情况下,您可能希望在连接或断开连接硬件键盘时更改应用布局,例如,为工具或编辑窗口腾出更多空间。

在 Jetpack Compose 中,您可以通过以下两种方式对键盘配置更改做出响应:

  1. 反应式界面: 使用 LocalConfiguration.current 直接在可组合项中读取当前配置状态。连接或断开连接键盘时,界面会自动重组以适应新状态。
  2. 副作用回调: 使用可感知生命周期的 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。

其他资源

如需了解如何在键盘连接或断开连接等配置更改期间保存应用的界面状态,请参阅保存界面状态