LazyColumn底部TextField点击后软键盘弹出即消失问题求助
问题根因
这个是Jetpack Compose 1.0.x版本的已知缺陷:当windowSoftInputMode设置为adjustResize时,软键盘弹出触发窗口尺寸重算,Scaffold传递给内容区域的内边距会同步更新,此时LazyColumn发生重排,重排过程中底部获得焦点的TextField会被暂时移出组合项,触发焦点丢失,系统就会自动收起软键盘,等重排完成TextField重新加入组合时,不会自动恢复焦点,就出现了软键盘闪一下消失的现象。
解决方案
方案1:升级Compose版本(推荐)
该问题在Compose 1.1.0及以上版本已经被官方修复,只需要将项目中Compose相关依赖的版本升级到1.1.0或更高版本即可直接解决,不需要修改业务代码。
方案2:低版本兼容临时方案
如果暂时不能升级Compose版本,可以通过以下修改解决:
- 给Scaffold的内容区域添加
Modifier.imePadding(),同时调整Insets适配逻辑:
@Composable fun Greeting() { Scaffold( topBar = { TopAppBar(title = { Text(text = "Some title") }) } ) { innerPadding -> val focusManager = LocalFocusManager.current LazyColumn( contentPadding = PaddingValues( top = innerPadding.calculateTopPadding(), bottom = 16.dp, start = 16.dp, end = 16.dp ), verticalArrangement = Arrangement.spacedBy(space = 16.dp), modifier = Modifier.imePadding() // 关键:添加输入法内边距适配 ) { items(count = 20) { index -> val (value, onValueChange) = rememberSaveable { mutableStateOf("Some value $index") } TextField( value = value, onValueChange = onValueChange, modifier = Modifier.fillMaxWidth(), label = { Text(text = "Some label $index") }, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), keyboardActions = KeyboardActions(onNext = { if (!focusManager.moveFocus(FocusDirection.Down)) focusManager.clearFocus() }), singleLine = true ) } } } }
- 同时需要在对应Activity的
onCreate方法中添加如下代码,关闭默认的系统窗口适配:
WindowCompat.setDecorFitsSystemWindows(window, false)
- Manifest文件中保持
windowSoftInputMode="adjustResize"配置即可。
内容的提问来源于stack exchange,提问作者Artem Radivilov
相关产品推荐
相关产品推荐

