Jetpack Compose Dialog - 有没有办法改变背景透明度?

14
当我们在Jetpack Compose中展示Dialog/AlertDialog时,背景色似乎有点暗,有没有方法可以调整背景的透明度或使其透明? 例如:在此图像中,白色背景在显示对话框时变为深灰色。
6个回答

21
你可以像这样轻松地实现它:
Dialog(onDismissRequest = {}) {
    (LocalView.current.parent as DialogWindowProvider)?.window?.setDimAmount(0f)
    // dialog content here...
   }

1
这是目前为止最好的答案。我已经寻找一个好的解决方案很长时间了。谢谢。 - odifek
1
你是我的救星。谢谢。 - Wonsik Sung
这也会影响在字体较大和显示尺寸较大的设备上的AlertDialog,对话框将占满整个宽度,这是这个问题的副作用。 - Unique Identifier
也许你需要在对话框布局中使用Modifier.padding()。 - Igor Konyukhov
1
但状态栏图标仍然亮着。由于背景没有变暗,状态栏图标变得不可见。Android 13。 - undefined

5

我曾尝试使用Dialog,但无法清除标志WindowManager.LayoutParams.FLAG_DIM_BEHIND

你可以尝试使用弹出窗口(Popup)代替对话框,这样一切都能正常工作。

Popup(
        onDismissRequest = {},
        properties = PopupProperties(
            focusable = true,
            dismissOnBackPress = false,
            dismissOnClickOutside = false,
            excludeFromSystemGesture = true,
        )
    ) {
        Box(
            contentAlignment = Alignment.Center,
            modifier = Modifier
                .fillMaxSize()
                .background(Color.Transparent)
        ) {
            // Your content code is here
        }
    }

3
这种行为由android.view.Window控制。
它深层嵌入在Dialog中,想要更改它的唯一方法是复制所有源代码。
然后,在源代码的此行中,您可以插入以下内容:
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)

2
您可以使用全屏对话框,然后在其中插入一张带有所需文本的卡片。例如:
AlertDialog(
            modifier = Modifier.fillMaxSize(),
            backgroundColor = Color.White.copy(alpha = 0.2f),
            properties = DialogProperties(usePlatformDefaultWidth = false),

您可以在文本部分添加您的卡片组件:
text = {
        Card(Modifier.size(200.dp)) {
        Text(text = "test")
     }
}

希望这有所帮助!

谢谢,但我不想创建一个新屏幕。当对话框显示在其上面时,我想改变当前屏幕的透明度,而不考虑其内容。 - AndroidDev

1
你可以通过更改窗口属性来实现这一点。以下是在对话框中如何做到这一点的方法:
Dialog(
    onDismissRequest = {
        
    }
) {
    val curView = LocalView.current
    /* Change the transparency of the dialog window */
    LaunchedEffect(curView) {
        tailrec fun Context.findWindow(): Window? = when (this) {
            is Activity -> window
            is ContextWrapper -> baseContext.findWindow()
            else -> null
        }

        fun View.findWindow(): Window? =
            (parent as? DialogWindowProvider)?.window ?: context.findWindow()

        try {
            val window = curView.findWindow() ?: return@LaunchedEffect
            val lp = window.attributes
            lp.dimAmount = dimAmount // Modify the dim amount value
            window.attributes = lp
        } catch (e: Throwable) {
            e.printStackTrace()
        }
    }
    // content
}

0
如果你想要设置透明背景,将decorFitsSystemWindows设为false似乎是可行的。
Dialog(
    onDismissRequest = { /*TODO*/ },
    properties = DialogProperties(decorFitsSystemWindows = false)
) {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接