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
相关产品推荐
相关产品推荐

