You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wear OS下Jetpack Compose中BasicTextField软键盘工作异常问题咨询

异常触发原因
  • 核心是Wear OS平台的Jetpack Compose输入交互逻辑和通用移动端存在差异,你当前使用的通用基础输入组件没有适配Wear OS的软键盘生命周期,导致InputConnection(输入框和软键盘的通信桥接)绑定时序异常:首次点击输入框时InputConnection在完成绑定前就被销毁,触发inactive InputConnection类警告,软键盘弹出后立刻被回收;第二次点击时焦点成功绑定但通信链路存在缺陷,所以键盘能弹出但无法同步显示输入预览内容,仅能最终将输入结果回传给输入框。
  • 其次你没有为Activity配置Wear OS适配的软键盘调整模式,键盘弹出时布局重排逻辑异常会间接导致输入框焦点丢失。
  • 输入组件没有显式声明焦点属性,Wear OS的触摸焦点判定逻辑和手机端存在差异,会提升焦点绑定失败的概率。
解决方案

1. 引入Wear OS专属Compose组件依赖

在模块级build.gradle中添加Wear Compose物料库依赖,版本需和你项目的Compose主版本对齐:

dependencies {
    implementation "androidx.wear.compose:compose-material:1.3.0"
}

2. 修改Activity软键盘配置

在AndroidManifest.xml对应Activity节点添加窗口软键盘适配属性:

<activity
    android:name=".YourTargetActivity"
    android:windowSoftInputMode="adjustResize">
    <!-- 其余原有配置保持不变 -->
</activity>

3. 调整Composable实现代码

替换通用BasicTextField为Wear专属的输入组件,补充焦点相关修饰符,修改后代码如下:

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun ActivationScreen() {
    var key by remember { mutableStateOf("") }
    var isReady by remember { mutableStateOf(false) }
    val keyboardController = LocalSoftwareKeyboardController.current

    Column(
        modifier = Modifier
            .padding(40.dp)
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        val focusRequester = remember { FocusRequester() }
        // 替换为Wear专属TextField
        androidx.wear.compose.material.TextField(
            value = key,
            onValueChange = {
                key = it
                isReady = it.length > 11
            },
            singleLine = true,
            keyboardOptions = KeyboardOptions.Default.copy(
                imeAction = ImeAction.Done
            ),
            keyboardActions = KeyboardActions(
                onDone = {
                    keyboardController?.hide()
                }
            ),
            modifier = Modifier
                .size(140.dp, 20.dp)
                .background(Color.White)
                .focusRequester(focusRequester)
                .focusable()
                .focusableInTouchMode(true)
        )

        Text(text = "ACTIVATION")
        val status = if (isReady) "READY" else "NOT READY"
        Text(text = status)
    }
}

额外验证项

如果修改后问题依然存在,确认项目Compose版本不低于1.2.0、Wear Compose版本不低于1.1.0,更低版本存在已知的Wear平台输入框焦点绑定官方Bug。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:01