Android Oreo及更早版本Material3 Modal Bottom Sheet底部padding异常问题
解决Material 3 1.3.0-beta04 Modal Bottom Sheet在Android 8.1及更早系统的底部padding问题
在Android Oreo 8.1及更早版本使用Material 3 1.3.0-beta04的ModalBottomSheet时,会出现底部padding过大、内容被遮挡的问题——哪怕手动设置windowInsets为(0,0,0,0)也没用。原因是这个beta版本把实现从PopupDialog改成了ModalBottomSheetDialog,内部默认加了Box(modifier = Modifier.fillMaxSize().imePadding()),旧系统上这个padding计算出了偏差。
下面是几个可行的解决办法:
1. 自定义windowInsets覆盖内部padding
利用ModalBottomSheet的windowInsets参数,传入自定义的WindowInsets实例,直接移除所有方向的padding:
@OptIn(ExperimentalMaterial3Api::class) @Composable fun FixedModalBottomSheet( sheetState: ModalBottomSheetState, onDismissRequest: () -> Unit, content: @Composable () -> Unit ) { ModalBottomSheet( sheetState = sheetState, onDismissRequest = onDismissRequest, windowInsets = WindowInsets(0, 0, 0, 0) ) { content() } }
然后在代码里替换原来的ModalBottomSheet:
class MainActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { Scaffold { _ -> val bottomSheetState = rememberModalBottomSheetState(true) FixedModalBottomSheet( sheetState = bottomSheetState, onDismissRequest = {} ) { Text("Status") OutlinedButton(onClick = {}) { Text("Confirm") } } } } } } }
2. 用负padding抵消内部额外空间
如果第一个方案不生效,可以在内容外层加个负padding的Modifier,把内部的多余padding抵消掉(数值可以根据实际显示情况调整):
ModalBottomSheet( sheetState = bottomSheetState, onDismissRequest = {}, ) { Column( modifier = Modifier .fillMaxWidth() .padding(bottom = -24.dp) ) { Text("Status") OutlinedButton(onClick = {}) { Text("Confirm") } } }
3. 临时回退到1.2.x稳定版
要是临时方案都没法满足需求,可以先回退到Material 3 1.2.x版本——这个版本用的是PopupDialog实现,不存在这个旧系统适配问题,等官方修复beta版的bug后再升级。
补充
这个问题是beta版本的实现变更导致的,旧Android系统对imePadding()的处理和新版本不一致,后续可以关注Material 3的正式版本更新,官方应该会修复这个适配问题。
内容的提问来源于stack exchange,提问作者Mohammad Al-Hussein
相关产品推荐
相关产品推荐

