在Jetpack Compose的自定义ModalBottomSheet中隐藏Android状态栏
在Jetpack Compose的自定义ModalBottomSheet中隐藏Android状态栏
我之前做项目时刚好遇到过一模一样的需求,其实在Compose里实现这个功能思路很清晰,咱们一步步来搞定:
首先,核心思路是监听ModalBottomSheet的状态变化,在它展开时隐藏状态栏,收起或关闭时恢复显示。咱们直接上可运行的代码示例,结合注释你一看就懂:
@OptIn(ExperimentalMaterial3Api::class) @Composable fun CustomModalBottomSheet( onDismissRequest: () -> Unit, sheetState: ModalBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) ) { val view = LocalView.current val window = (view.context as Activity).window // 监听BottomSheet的状态,动态控制状态栏 LaunchedEffect(sheetState.currentValue) { when (sheetState.currentValue) { // 展开/部分展开时隐藏状态栏,可根据需求调整 ModalBottomSheetValue.Expanded, ModalBottomSheetValue.PartiallyExpanded -> { window.insetsController?.hide(WindowInsets.Type.statusBars()) } // 收起时恢复状态栏显示 ModalBottomSheetValue.Hidden -> { window.insetsController?.show(WindowInsets.Type.statusBars()) } } } // 防止BottomSheet意外销毁(比如屏幕旋转)后状态栏一直隐藏 DisposableEffect(Unit) { onDispose { window.insetsController?.show(WindowInsets.Type.statusBars()) } } ModalBottomSheet( onDismissRequest = onDismissRequest, sheetState = sheetState ) { // 这里放你的BottomSheet自定义内容 Column( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text("我的自定义BottomSheet内容") // 可以添加更多UI组件,比如按钮、列表等等 } } }
一些细节补充:
- 如果你需要兼容API 30以下的旧设备,直接用系统的
WindowInsetsController可能会有问题,这时候可以改用ViewCompat和WindowInsetsCompat来处理:val insetsController = ViewCompat.getWindowInsetsController(view) // 隐藏状态栏 insetsController?.hide(WindowInsetsCompat.Type.statusBars()) // 恢复显示 insetsController?.show(WindowInsetsCompat.Type.statusBars()) - 要是你希望BottomSheet展开时,内容能延伸到原来状态栏的区域(而不是只是隐藏状态栏),可以额外设置
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS),不过记得在恢复状态时要清除这个标记哦。 - 确保你的Activity主题没有强制设置全屏,不然这些状态栏控制逻辑可能不会生效。
这样设置后,当用户打开你的自定义ModalBottomSheet时,状态栏会自动隐藏,关闭或收起时又会恢复,完美契合需求~
内容来源于stack exchange
相关产品推荐
相关产品推荐

