如何让Compose Dialog在usePlatformDefaultWidth=false时适配折叠屏导航栏?
解决Compose Dialog关闭默认宽度后导航栏遮挡问题
问题根源
当设置usePlatformDefaultWidth=false时,Compose Dialog会禁用平台默认的布局适配逻辑,包括自动处理系统Insets的逻辑,导致navigationBarsPadding()无法获取正确的导航栏内边距,最终内容被导航栏遮挡。
解决方案一:配置Window属性恢复Insets感知
通过手动配置Dialog对应的Window属性,让其正确识别系统导航栏,从而使Insets API返回有效值:
setContent { Surface(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.Bottom ) { Text("Hello") } Dialog( onDismissRequest = {}, properties = DialogProperties( dismissOnBackPress = false, dismissOnClickOutside = false, usePlatformDefaultWidth = false, ), ) { val view = LocalView.current LaunchedEffect(Unit) { val window = (view.context as Activity).window // 允许Window布局延伸到系统栏下方,同时保持Insets感知 window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION window.setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ) } Column( modifier = Modifier .fillMaxSize() .navigationBarsPadding() // 现在可正确获取导航栏内边距 .background(Color.Blue), verticalArrangement = Arrangement.Bottom, ) { Column( modifier = Modifier .size(100.dp) .background(Color.Yellow) ) {} } } } }
解决方案二:手动添加导航栏高度padding
如果方案一不生效,可直接通过系统资源获取导航栏高度,手动设置底部padding:
setContent { Surface(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.Bottom ) { Text("Hello") } Dialog( onDismissRequest = {}, properties = DialogProperties( dismissOnBackPress = false, dismissOnClickOutside = false, usePlatformDefaultWidth = false, ), ) { val context = LocalContext.current // 从系统资源获取导航栏高度 val navigationBarHeight = remember { val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android") if (resourceId > 0) { context.resources.getDimensionPixelSize(resourceId).dp } else { 0.dp } } Column( modifier = Modifier .fillMaxSize() .padding(bottom = navigationBarHeight) // 手动添加导航栏高度的padding .background(Color.Blue), verticalArrangement = Arrangement.Bottom, ) { Column( modifier = Modifier .size(100.dp) .background(Color.Yellow) ) {} } } } }
内容的提问来源于stack exchange,提问作者Grzegorz Adam Hankiewicz
相关产品推荐
相关产品推荐

