【问题标题】:Is there a way customize WindowManager.LayoutParams of an AlertDialog with Jetpack Compose有没有办法使用 Jetpack Compose 自定义 AlertDialog 的 WindowManager.LayoutParams
【发布时间】:2022-07-16 23:55:23
【问题描述】:

我尝试在其他应用程序上显示警报对话框。已授予权限。

<uses-permission android:name="ACTION_MANAGE_OVERLAY_PERMISSION"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Composable 方式根本行不通,代码如下:

AlertDialog(onDismissRequest = { dialogEnabled.value = false },
    title = { Text(text = "Test")},
    text = {
           Text(text = message)
    },
    confirmButton = {
        TextButton(onClick = { dialogEnabled.value = false }) {
            Text(text = "Confirm")
        }
    },
    dismissButton = {
        TextButton(onClick = { dialogEnabled.value = false }) {
            Text(text = "Cancel")
        }
    }
)

我必须将 AlertDialog 的窗口类型设置为 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY。但是,我查看AndroidDialog.android.kt下的AlertDialog的代码,没有办法得到对话框实例的引用,甚至没有DialogProperty。

最终,我用传统的方式来实现它

private fun showDialog(message: String){
    val builder: AlertDialog.Builder = AlertDialog.Builder(this) //set icon
        .setIcon(android.R.drawable.ic_dialog_alert) //set title
        .setTitle("Game Analysis") //set message
        .setMessage(message) //set positive button
        .setPositiveButton(
            "Confrim"
        ) { dialogInterface, i -> //set what would happen when positive button is clicked
            dialogInterface.dismiss()
        } //set negative button
        .setNegativeButton(
            "Cancel"
        ) { dialogInterface, i -> //set what should happen when negative button is clicked
            dialogInterface.dismiss()
        }
    val alertDialog: AlertDialog = builder.create()
    alertDialog.window!!.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
    alertDialog.show()
}

【问题讨论】:

    标签: android android-alertdialog android-jetpack-compose


    【解决方案1】:

    使用 Jetpack Compose Android 自定义 AlertDialog。 Jetpack Compose 是一款出色的全新 Android 声明式 UI 工具,它允许使用 Kotlin 创建 UI,以替代繁琐的 XML 布局。

    enter image description here

    //Create custom dialog
    @Composable
    fun DialogExample(
        onDismiss: () -> Unit,
        onNegativeClick: () -> Unit,
        onPositiveClick: () -> Unit
    ) {
        Dialog(onDismissRequest = onDismiss) {
            val color = Color(0xff4DB6AC)
            Card(elevation = 8.dp, shape = RoundedCornerShape(12.dp)) {
                Column {
                    Box(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(160.dp)
                            .background(color)
                    ) {
                        Icon(
                            tint = Color.White,
                            painter = painterResource(id = R.drawable.ic_baseline_location_on_24),
                            contentDescription = null,
                            modifier = Modifier
                                .graphicsLayer(scaleX = 1.2f, scaleY = 1.2f)
                                .align(
                                    Alignment.Center
                                )
                        )
                    }
    
                    Column(modifier = Modifier.padding(16.dp)) {
                        CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
                            Text("To send a nearby place or your location, allow access to your location.")
                        }
                        Row(
                            horizontalArrangement = Arrangement.End,
                            modifier = Modifier.fillMaxWidth()
                        ) {
    
                            Text(
                                text = "Not Now", color = color,
                                modifier = Modifier
                                    .clickable(
                                        interactionSource = MutableInteractionSource(),
                                        indication = rememberRipple(color = Color.DarkGray),
                                        onClick = onNegativeClick
                                    )
                                    .padding(8.dp)
                            )
    
                            Spacer(modifier = Modifier.width(4.dp))
                            Text(
                                text = "Allow", color = color,
                                modifier = Modifier
                                    .clickable(
                                        interactionSource = MutableInteractionSource(),
                                        indication = rememberRipple(color = Color.DarkGray),
                                        onClick = onPositiveClick
                                    )
                                    .padding(8.dp)
                            )
                        }
                    }
                }
            }
        }
    

    您可以使用此代码显示警报对话框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      相关资源
      最近更新 更多