JetpackCompose中的Dialog、AlertDialog

news2024/12/28 18:34:23

跟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后再进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习复习(5)——激活函数

目录 激活函数分类 区别与优缺点 饱和激活函数 非饱和激活函数 综合考虑 Sigmoid激活函数 Tanh激活函数 ReLU激活函数 Leaky Relu激活函数 Swish激活函数 激活函数分类 激活函数可以分为两大类 : 饱和激活函数:sigmoid、tanh非饱和激活函数:…

Blender教程(基础)-顶点的移动、滑移-16

一、顶点的移动与缩放 ShiftA新建柱体、切换到编辑模式 点模式下,选择一个顶点、选择移动(GZ),发现顶点严Z轴移动,如下图所示 GY 按数字键盘7切换视图,选择这个面的所有顶点 按S把面缩放大 Ctrl…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题,覆盖了Python的多个核心领域,包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例,帮助读者更好地理解和应用相关知识点无论是对…

《Git 简易速速上手小册》第8章:保护你的代码(2024 最新版)

文章目录 8.1 使用 .gitignore 优化你的仓库8.1.1 基础知识讲解8.1.2 重点案例:为 Python 项目配置 .gitignore8.1.3 拓展案例 1:使用全局 .gitignore8.1.4 拓展案例 2:忽略已经被跟踪的文件 8.2 管理敏感数据8.2.1 基础知识讲解8.2.2 重点案…

C++内存模型的内存布局

C内存模型的内存布局 什么是内存模型内存布局及作用C程序的内存布局 本文章介绍了C程序的内存布局,并附有一段演示 数据区和 栈区存储不同类型变量的代码示例。 什么是内存模型 在计算机科学中,程序的内存模型是指程序在内存中的组织结构和存储方式的抽…

基于java+springboot+vue实现的房屋租赁管理系统(文末源码+Lw)23-142

第1章 绪论 房屋租赁管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、字典管理、租房房源管理、租房评价管理、房源租赁管理、租房预约管理、论坛管理、公告管理、投诉建议管理、用户管理、租房合同管理、管理员管理。用户的功能等。该系统采用了My…

pwn学习笔记(2)ret_2_text_or_shellcode

pwn学习笔记(2) 1.三种常见的寄存器: ​ ax寄存器:通用寄存器,可用于存放多种数据 ​ bp寄存器:存放的是栈帧的栈底地址 ​ sp寄存器:存放的是栈顶的地址 2.栈帧与栈工作的简介&#xff1a…

【C生万物】C语言数据类型、变量和运算符

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

Sui与Thrive合作推出ThinkSui平台,72万美元奖励给Sui贡献者

我们很高兴宣布推出ThinkSui平台,这是一个新的计划,旨在认可Sui社区成员、建设者和创作者。该计划由Sui和Thrive合作推出,旨在为Sui社区提供了一个让他们分享想法的平台,并将其转化为有影响力的贡献,使用户因推动Sui生…

向量搜索查询faiss、annoy

首先介绍annoy : 转发空间:https://download.csdn.net/blog/column/10872374/114665212 Annoy是高维空间求近似最近邻的一个开源库。 Annoy构建一棵二叉树,查询时间为O(logn)。 Annoy通过随机挑选两个点,并使用垂直于这个点的等距离超平面…

图数据库neo4j入门

neo4j 一、安装二、简单操作<一>、创建<二>、查询<三>、关系<四>、修改<五>、删除 三、常见报错<一>、默认的数据库密码是neo4j,打开浏览器http://localhost:7474登录不上,报错: Neo.ClientError.Security.Unauthorized: The client is un…

Tkinter教程21:Listbox列表框+OptionMenu选项菜单+Combobox下拉列表框控件的使用+绑定事件

------------★Tkinter系列教程★------------ Tkinter教程21&#xff1a;Listbox列表框OptionMenu选项菜单Combobox下拉列表框控件的使用绑定事件 Tkinter教程20&#xff1a;treeview树视图组件&#xff0c;表格数据的插入与表头排序 Python教程57&#xff1a;tkinter中如何…

【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题

文章目录 &#x1f354;Redis的分布式锁&#x1f6f8;误删问题&#x1f388;解决方法&#x1f50e;代码实现 &#x1f6f8;原子性问题&#x1f339;Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁&#x1f50e;代码实现 &#x1f354;Redis的分布式锁 Redis的分布式锁是通过利…

【RT-DETR有效改进】轻量级下采样方法ContextGuided(参数量下降700W,轻量又涨点)

&#x1f451;欢迎大家订阅本专栏&#xff0c;一起学习RT-DETR&#x1f451; 一、本文介绍 本文给大家带来的是改进机制是一种替换Conv的模块Context Guided Block (CG block) &#xff0c;其是在CGNet论文中提出的一种模块&#xff0c;其基本原理是模拟人类视觉系统依赖上…

dbeaver免费、跨平台数据管理软件

下载 dbeaver是一款的数据库连接工具&#xff0c;免费&#xff0c;跨平台。 官网&#xff1a;DBeaver Community | Free Universal Database Tool下载地址&#xff1a;Download | DBeaver Community 点击下载 安装 修改安装路径 点击安装 点击完成 使用 连接mysql 已连接 点…

一个 SpringBoot 项目能同时处理多少请求?

目录 1 问题分析 2 Demo 3 答案 4 怎么来的&#xff1f; 5 标准答案及影响参数一Tomcat配置 6 影响参数二 Web容器 7 影响参数三 Async 1 问题分析 一个 SpringBoot 项目能同时处理多少请求&#xff1f; 不知道你听到这个问题之后的第一反应是什么&#xff1f; 我大概…

Maven - 编译报错:程序包 XXX 不存在(多模块项目)

问题描述 编译报错&#xff1a;程序包 XXX 不存在&#xff08;多模块项目&#xff09; 原因分析 检查依赖模块 pom 文件&#xff0c;看是不是引入了如下插件 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…

STM32/C51开发环境搭建(KeilV5安装)

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统&#xff0c;与汇编相比&#xff0c;C语言在功能上、结构性、可读性、可维护性上有明显的优势&#xff0c;因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等…

5.electron之主进程起一个本地服务

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

信钰证券:稀土板块集体爆发,十余股涨停!脑机接口新进展

脑机接口迎多重利好。 大盘指数早间延续反弹&#xff0c;深证成指一度涨逾3%&#xff0c;半导体芯片、医药医疗、军工等方向涨幅居前。白酒股震荡拉升&#xff0c;金徽酒涨超7%&#xff0c;老白干酒涨超5%&#xff0c;金种子酒、迎驾贡酒等跟涨。 高股息股逆势走弱&#xff0c…