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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:03:10