为何adjustNothing在ModalBottomSheet中未生效?键盘弹出时按钮上移
ModalBottomSheet按钮随键盘上移问题解决
问题场景
点击ModalBottomSheet内的文本框弹出键盘时,底部按钮会随键盘上移。全局未配置windowSoftInputMode,处于adjustNothing状态,但普通Column组件无此异常。
用户代码示例:
ModalBottomSheet( onDismissRequest = { showDeleteUserSheet = false }, sheetState = sheetState ) { Box( modifier = Modifier .fillMaxSize() .padding(16.dp) ) { Column(modifier = Modifier .fillMaxWidth() .align(Alignment.TopCenter), horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = "Sample title", textAlign = TextAlign.Center, modifier = Modifier.wrapContentSize() ) Spacer(modifier = Modifier.height(24.dp)) Text( text = "text", color = MaterialTheme.colorScheme.white.copy(alpha = 0.6f), textAlign = TextAlign.Center, modifier = Modifier.wrapContentSize() ) Spacer(modifier = Modifier.height(40.dp)) TextField( hint = "Sample hint1" ) Spacer(modifier = Modifier.height(10.dp)) TextField( hint = "Sample hint2" ) } Column(modifier = Modifier.align(Alignment.BottomCenter)) { Button() { } Spacer(modifier = Modifier.height(10.dp)) Button() { } Spacer(modifier = Modifier.height(50.dp)) } } }
解决方法
方法1:替换固定间距为imePadding()
将底部Column的固定底部Spacer替换为imePadding()修饰符,让布局自动适配键盘高度,同时保持按钮位置相对底部不变:
Column(modifier = Modifier .align(Alignment.BottomCenter) .imePadding()) { Button() { } Spacer(modifier = Modifier.height(10.dp)) Button() { } }
方法2:取消ModalBottomSheet的IME响应
通过windowInsets参数强制关闭Sheet对输入法内边距的响应:
ModalBottomSheet( onDismissRequest = { showDeleteUserSheet = false }, sheetState = sheetState, windowInsets = WindowInsets(0, 0, 0, 0) ) { // 原有内容 }
方法3:拦截嵌套滚动事件
添加NestedScrollConnection拦截键盘触发的滚动行为,阻止内容上移:
val nestedScrollConnection = remember { object : NestedScrollConnection { override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { return if (source == NestedScrollSource.SoftwareKeyboard) available else Offset.Zero } } } ModalBottomSheet(...) { Box( modifier = Modifier .fillMaxSize() .padding(16.dp) .nestedScroll(nestedScrollConnection) ) { // 原有内容 } }
原因分析
ModalBottomSheet内部默认会监听输入法窗口的变化,即使全局设置adjustNothing,其内部布局逻辑仍会根据键盘高度调整内容位置。上述方法分别通过适配内边距、取消响应、拦截滚动三种方式,阻断了Sheet内容随键盘上移的行为。
内容的提问来源于stack exchange,提问作者SangSun
相关产品推荐
相关产品推荐

