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
相关产品推荐
相关产品推荐

