Android Compose 中的全屏对话框不占用全屏高度

问题描述 投票:0回答:3
Dialog(
  properties = DialogProperties(usePlatformDefaultWidth = false),
  onDismissRequest = {viewModel.showDialog.value = false}
){
  Column(modifier = Modifier.width(LocalConfiguration.current.screenWidthDp.dp)
    .height(LocalConfiguration.current.screenHeightDp.dp).background(color = Color.Black.copy(alpha = 1f))) {

  }
}

运行此代码会产生全屏对话框,但高度与屏幕高度不完全匹配。

有什么方法可以让对话框占据屏幕尺寸的全部宽度和高度吗?

请查看下面的屏幕截图:

android dialog android-jetpack-compose
3个回答
7
投票

如果您了解 screenHeightDp 是如何定义的。

可用屏幕空间的当前高度,以 dp 为单位,对应于屏幕高度资源限定符。

显然,它不包括窗口嵌入所占用的区域,例如状态栏、导航栏和切口。

所以这是我设法解决问题的解决方案。它尝试从 WindowManager 获取整个屏幕大小。并通过

Modifier.requiredSize()
喂它们。请注意,使用
requiredSize
忽略父约束非常重要,否则它将不起作用。更多信息请访问 https://stackoverflow.com/a/65779227/157675 .

    Dialog(
        properties = DialogProperties(usePlatformDefaultWidth = false),
        onDismissRequest = onDismiss
    ) {
        val context = LocalContext.current
        val windowManager =
            remember { context.getSystemService(Context.WINDOW_SERVICE) as WindowManager }

        val metrics = DisplayMetrics().apply {
            windowManager.defaultDisplay.getRealMetrics(this)
        }
        val (width, height) = with(LocalDensity.current) {
            Pair(metrics.widthPixels.toDp(), metrics.heightPixels.toDp())
        }
        Column(
            modifier = Modifier
                .requiredSize(width, height)
                .background(color = Color.Green)
        ) {
           // ...
        }
    }

0
投票

上述解决方案中存在已弃用的代码。更新后的解决方案代码如下:

val context = LocalContext.current
val windowManager =
    remember { context.getSystemService(Context.WINDOW_SERVICE) as WindowManager }

val windowMetrics = windowManager.currentWindowMetrics
val bounds = windowMetrics.bounds
val (width, height) = with(LocalDensity.current) {
    Pair(bounds.width().toDp(), bounds.height().toDp())
}

-1
投票

要使对话框填满全屏,请使用

Modifier.fillMaxSize()
或使用
Modifier.fillMaxWidth()
Modifier.fillMaxHeight()

© www.soinside.com 2019 - 2024. All rights reserved.