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

Jetpack Compose Scaffold与系统控件(状态栏、导航栏)重叠问题求助

解决Jetpack Compose中Scaffold与系统控件重叠问题

你的问题根源出在设置的Window Flags里的TYPE_KEYGUARD_DIALOG,这个过时标记会让Activity以锁屏对话框的层级运行,导致Compose无法正确获取状态栏、导航栏的系统Insets(间距信息),所以单纯加navigationBarsPadding()没用。按以下步骤修复:

1. 替换过时的Window Flags

TYPE_KEYGUARD_DIALOG已经被废弃,改用官方推荐的API实现锁屏显示和亮屏功能,保留FLAG_KEEP_SCREEN_ON即可:

// 保留屏幕常亮
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

// 替换原有的锁屏/亮屏Flags
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    setShowWhenLocked(true)
    setTurnScreenOn(true)
} else {
    window.addFlags(
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    )
}

2. 让Compose正确接收系统Insets

在Activity的onCreate方法中,添加以下代码,让系统Insets能正确传递给Compose布局:

WindowCompat.setDecorFitsSystemWindows(window, false)
val insetsController = WindowCompat.getInsetsController(window, window.decorView)
insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

3. 正确使用Scaffold的paddingValues

你代码里的paddingValues -是笔误,要改成paddingValues ->,并将这个参数传递给NavHost的Modifier,Scaffold的这个lambda参数已经包含了避开状态栏、导航栏和bottomBar的间距:

Scaffold(
    scaffoldState = scaffoldWithDrawerState,
    drawerContent = {
        SideDrawerHeader(onViewProfileClicked = {})
        SideDrawerBody(onSidebarMenuItemClicked = {})
    },
    bottomBar = {
        BottomBar(navController = navController)
    }
) { paddingValues ->
    DestinationsNavHost(
        navGraph = NavGraphs.app,
        navController = navController,
        modifier = Modifier.padding(paddingValues)
    )
}

完成以上三步后,Scaffold的内容就会自动避开状态栏、导航栏等系统控件,不会再出现重叠问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:31:14