JetpackCompose中的Dialog、AlertDialog

本文介绍了如何在Compose中使用Dialog和AlertDialog,包括它们的构造函数参数、基本用法以及如何进行定制,如自定义按钮和内容。
摘要由CSDN通过智能技术生成

跟View体系一样,Compose中也用Dialog做提示框的。既然有这个API,那我们还是得卷起来熟悉下使用流程及方法。

Dialog

其构造函数如下:

@Composable
fun Dialog(
    onDismissRequest: () -> Unit,
    properties: DialogProperties = DialogProperties(),
    content: @Composable () -> Unit
)

不难看出,声明对象时总共需要声明三个参数:

· onDismissRequest: () -> Unit :点击对话框外部或者按下返回按钮的时候会执行的内容。

· properties: DialogProperties? = null :进一步配置特定属性的对话框。

· contentColor: Color = contentColorFor(backgroundColor) :提供给其内容的背景颜色。

下面举个例子:

var showDialog by remember {
    mutableStateOf(false)
}
Button(onClick = { showDialog = !showDialog }) {
    Text("show dialog")
}
if (showDialog) {
    Dialog(onDismissRequest = { showDialog = !showDialog }) {
        Column(
            modifier = Modifier
                .size(200.dp, 50.dp)
                .background(Color.White)
        ) {
            Text(text = "这是一段描述Dialog内容的文本")
        }
    }
}

对应的效果为:

dialog_click.gif

代码逻辑较简单,点击button即展示dialog,这里使用了关键字remember来刷新布尔值。其余没其他好说的,可能你会纳闷,为什么要在Dialog内部声明一个白色的Column呢。其实默认的Dialog是全屏样式,并且这里没有Modifier的自定义参数来修改样式。Dialog的关于使用方面的内容较简单,其内部复杂构造可以在后面等更新Compose的页面刷新机制。

AlertDialog

Dialog的参数是如此之少,可定制范围如此之小。Google会将这种设计放任不管?答案是明显的,还有一个替代Dialog的AlertDialog存在。根据其介绍:

AlertDialog是一个用紧急信息,详细信息或操作打断当前用户行为的对话框。

说白了就是一个可以浮在界面最上方的对话框。先看看其两个构造函数:

@Composable
fun AlertDialog(
    onDismissRequest: () -> Unit,
    buttons: @Composable () -> Unit,
    modifier: Modifier = Modifier,
    title: (@Composable () -> Unit)? = null,
    text: @Composable (() -> Unit)? = null,
    shape: Shape = MaterialTheme.shapes.medium,
    backgroundColor: Color = MaterialTheme.colors.surface,
    contentColor: Color = contentColorFor(backgroundColor),
    properties: DialogProperties = DialogProperties()
)
@Composable
fun AlertDialog(
    onDismissRequest: () -> Unit,
    confirmButton: @Composable () -> Unit,
    modifier: Modifier = Modifier,
    dismissButton: @Composable (() -> Unit)? = null,
    title: @Composable (() -> Unit)? = null,
    text: @Composable (() -> Unit)? = null,
    shape: Shape = MaterialTheme.shapes.medium,
    backgroundColor: Color = MaterialTheme.colors.surface,
    contentColor: Color = contentColorFor(backgroundColor),
    properties: DialogProperties = DialogProperties()
)

其各个参数含义如下:

· modifier: Modifier = Modifier:修饰符,这没得说。

· onDismissRequest: () -> Unit:点击对话框外部或者按下返回按钮的时候会执行的内容。注意:点击对话框的关闭按钮时并不会执行。

· confirmButton: () -> Unit:由用户确认操作的按钮,默认没有回调,需自行设置回调事件。

· dismissButton: () -> Unit = null :用于关闭对话框的按钮,默认没有回调,需自行设置回调事件。

· title: () -> Unit = null:标题,无默认内容。

· text: () -> Unit = null:内容,无默认内容。

· shape: Shape = MaterialTheme.shapes.medium:对话框的形状(Material主题)。

· backgroundColor: Color = MaterialTheme.colors.surface:对话框背景色。

· contentColor: Color = contentColorFor(backgroundColor):提供给其内容的背景颜色。

· properties: DialogProperties? = null:进一步配置特定属性的对话框。

由上可见两个AlertDialog的构造函数里的参数区别就在于Button是否可自定义。一个是默认按钮,一个是自定义按钮(可以使用Column等不同布局去展现摆放方式不同的按钮)。

观察其源码架构你会发现,AlertDialog的第一个构造函数继承自第二个函数,而第二个构造函数又继承自androidx.compose.ui.window.Dialog。这也就不难理解为什么AlertDialog跟Dialog的构造函数有三个参数一致了。

常规的使用方式也较简单:

var showDialog by remember {
    mutableStateOf(false)
}
Column() {
    Button(onClick = { showDialog = !showDialog }) {
        Text("click show AlerDialog")
    }
    if (showDialog) {
        AlertDialog(
            onDismissRequest = {
                showDialog = false
            },
            title = {
                Text(text = "Title")
            },
            text = {
                Text(
                    "This area typically contains the supportive text " +
                            "which presents the details regarding the Dialog's purpose."
                )
            },
            confirmButton = {
                TextButton(
                    onClick = {
                        showDialog = false
                    }
                ) {
                    Text("Confirm")
                }
            },
            dismissButton = {
                TextButton(
                    onClick = {
                        showDialog = false
                    }
                ) {
                    Text("Dismiss")
                }
            }
        )
    }
}

其对应效果为:

dialoggif.gif

当然,这只是较简单的例子,后续可以做更多自定义内容,如果想做最大程度的自定义,可以像AlertDialog继承Dialog一样,继承AlertDialog后再进行修改。

  • 34
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值