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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:23:22