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

使用adjustResize时LazyColumn内TextField键盘弹出后立即关闭的问题

解决LazyColumn中TextField与adjustResize的兼容问题

问题根源

启用android:windowSoftInputMode="adjustResize"后,键盘弹出会触发Activity布局重计算,LazyColumn在重新测量和布局过程中可能导致已获取焦点的TextField被回收或失去焦点,进而引发键盘弹出后立即关闭的异常。

解决方案

方案1:用Compose的IME内边距替代adjustResize(推荐)

移除Manifest中的adjustResize配置,改用Compose内置的IME内边距处理来让底部按钮随键盘上移,同时保留LazyColumn的正常焦点行为。

  1. 修改AndroidManifest.xml:
    删除android:windowSoftInputMode="adjustResize"配置项。

  2. 给底部按钮添加IME内边距:
    使用Modifier.imePadding()自动为底部按钮添加与键盘高度匹配的内边距,确保键盘弹出时按钮不会被遮挡:

    Box(
        modifier = Modifier
            .fillMaxWidth()
            .imePadding() // 键盘弹出时自动添加底部内边距
    ) {
        Row(
            modifier = Modifier.fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceAround
        ) {
            Button(onClick = { /* 撤销逻辑 */ }) { Text("撤销") }
            Button(onClick = { /* 重做逻辑 */ }) { Text("重做") }
        }
    }
    
  3. 保持LazyColumn原代码:
    无需修改LazyColumn的实现,TextField的焦点和自动滚动行为会正常工作。

方案2:保留adjustResize并手动管理焦点与滚动

若必须保留adjustResize配置,可通过手动控制焦点和滚动来避免TextField失焦:

val listState = rememberLazyListState()
var focusedItemIndex by remember { mutableStateOf<Int?>(null) }

LazyColumn(state = listState) {
    itemsIndexed(20) { index, _ ->
        val focusRequester = remember { FocusRequester() }
        TextField(
            value = "item{$index}",
            onValueChange = {},
            modifier = Modifier
                .focusRequester(focusRequester)
                .onFocusChanged { state ->
                    if (state.isFocused) {
                        focusedItemIndex = index
                    } else if (!state.hasFocus && focusedItemIndex == index) {
                        focusedItemIndex = null
                    }
                }
        )
    }
}

// 当焦点项变化时,立即滚动到对应位置
LaunchedEffect(focusedItemIndex) {
    focusedItemIndex?.let {
        listState.scrollToItem(it)
        // 可选:使用动画滚动
        // listState.animateScrollToItem(it)
    }
}

额外建议

  • 尝试升级Compose版本到1.4.0及以上,后续版本修复了多个与焦点、键盘交互相关的兼容性问题。
  • 避免在LazyColumn的item中使用不稳定的状态或lambda,减少不必要的重组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:45:47