鸿蒙(HarmonyOS)常见的三种弹窗方式
最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能。
警告弹窗
警告弹窗是一个App中非常常用的弹窗,例如:
- 删除一条记录,提示一下用户:您确定要删除吗?
- 在App首页,点击返回时,提示一下用户:您确定要退出App吗?
使用AlertDialog.show方法进行弹窗,这个方法支持传入以下三个类中的任意一个对象
- AlertDialogParamWithConfirm
- AlertDialogParamWithButtons
- AlertDialogParamWithOptions
以AlertDialogParamWithButtons对象进行说明,下面表格介绍常用属性:
| 参数名 | 参数类型 | 必填 | 参数描述 |
|---|---|---|---|
| title | ResourceStr | 否 | 弹窗标题 |
| message | ResourceStr | 是 | 弹窗内容 |
| autoCancel | boolean | 否 | 点击遮障层时,是否关闭弹窗。默认值:true |
| primaryButton | 否 | 按钮的文本内容、文本色、按钮背景色和点击回调 | |
| secondaryButton | 否 | 按钮的文本内容、文本色、按钮背景色和点击回调 | |
| cancel | () => void | 否 | 点击遮障层关闭dialog时的回调 |
| alignment | DialogAlignment | 否 | 弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default |
接下来,我们用代码来实现一下:
AlertDialog.show({
title:"弹窗标题",
message:"这是弹窗内容",
autoCancel:true,//点击遮障层时,是否关闭弹窗。默认值:true
alignment: DialogAlignment.Center,//弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default
primaryButton: {
value: "取消",
fontColor: '#181818',
action: () => {
AppUtil.showToast("点击了取消按钮");
}
},
secondaryButton: {
value: "确定",
fontColor: $r('app.color.mainColor'),
action: () => {
AppUtil.showToast("点击了确定按钮");
}
},
cornerRadius:12,//弹窗边框弧度
width:'80%', //弹窗宽度
cancel:()=>{
AppUtil.showToast("点击遮障层关闭dialog时的回调");
}
})
效果图:

参考官方链接:
自定义弹窗
自定义弹窗相比警告弹窗更为灵活,支持自定义弹窗的样式与内容。
自定义弹窗的参数:
| 参数名 | 参数类型 | 必填 | 参数描述 |
|---|---|---|---|
| builder | CustomDialog | 是 | 自定义弹窗内容构造器。 |
| cancel | () => void | 否 | 点击遮障层退出时的回调。 |
| autoCancel | boolean | 否 | 是否允许点击遮障层退出。默认值:true |
| alignment | DialogAlignment | 否 | 弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default |
| offset | Offset | 否 | 弹窗相对alignment所在位置的偏移量。 |
| customStyle | boolean | 否 | 弹窗容器样式是否自定义。默认值:false,弹窗容器的宽度根据栅格系统自适应,不跟随子节点;高度自适应子节点,最大为窗口高度的90%;圆角为24vp。 |
| gridCount8+ | number | 否 | 弹窗宽度占栅格宽度的个数。默认为按照窗口大小自适应,异常值按默认值处理,最大栅格数为系统最大栅格数。 |
代码实现
我们使用自定义弹窗实现隐私政策弹窗,新建PrivacyPolicyDialogBackUp类,也就是内容构造器,使用@CustomDialog修饰,内部有一个属性controller: CustomDialogController,这些都是常规写法,然后在build中实现界面布局。
@CustomDialog
export default struct PrivacyPolicyDialogBackUp{
controller: CustomDialogController
cancel!: () => void
confirm!: () => void
build() {
Column() {
Text($r('app.string.simple_user_policy')).fontSize(18).fontColor($r('app.color.title_color')).margin({ top: 30, bottom: 19 })
Scroll(){
Text(){
Span($r('app.string.privacy_policy_start'))
Span($r('app.string.user_agreement_two')).fontColor($r('app.color.mainColor')).onClick(() => {
this.openWebUrl("/useragreement.html");
})
Span($r('app.string.and'))
Span($r('app.string.privacy_policy_two')).fontColor($r('app.color.mainColor')).onClick(() => {
this.openWebUrl("/privacypolicy.html");
})
Span($r('app.string.simple_privacy_policy'))
}.fontSize(16).fontColor($r('app.color.body_color')).margin({
left:25,
right:25
})
}.height(120)
Column(){
Button($r('app.string.disagree_privacy_policy')).onClick(() => {
this.controller.close();
this.cancel();
}).fontColor($r('app.color.other_color')).fontSize(15).backgroundColor(Color.Transparent)
Button($r('app.string.agree_privacy_policy')).onClick(() => {
this.controller.close();
this.confirm();
}).fontColor($r('app.color.white')).fontSize(17)
.linearGradient({
direction: GradientDirection.Right, colors:[[$r('app.color.start_main_color'),0.0],[$r('app.color.end_main_color'),1.0]]
}).width('80%').margin({
top:15,bottom:21
}).borderRadius(24)
}
}
}
openWebUrl(urlSuffix:string){
let url= AppConstant.URL+urlSuffix;
logger.info("url:"+url)
router.pushUrl({
url: Pages.WebViewPage,
params:{
data1: 'message',
url: url, // 传递的 URL 参数
}
}, router.RouterMode.Single)
}
}
在组件中创建CustomDialogController实例,指定builder属性,就是上面写的内容构造器
privacyPolicyDialog: CustomDialogController = new CustomDialogController({
builder: PrivacyPolicyDialog({
cancel:this.onCancel.bind(this),
confirm:this.onAgree.bind(this)
}),
alignment: DialogAlignment.Default, // 可设置dialog的对齐方式,设定显示在底部或中间等,默认为底部显示
cornerRadius:13,
autoCancel:false
})
显示弹窗
this.privacyPolicyDialog.open();
关闭弹窗
this.privacyPolicyDialog.close();
效果图:

参考官方链接:
加载中弹窗
加载中弹窗弹窗其实就是自定义弹窗实现,只是内容构造器不一样而已,给Image组件设置animation动画,无限循环图片
@CustomDialog
export default struct LoadingDialog {
controller: CustomDialogController
private loadingText: string|Resource = "加载中..."
@State angle:number = 10
aboutToAppear(){
setTimeout(()=>{
this.angle = 1440 // 设定一个大的旋转角度,确保动画执行
},100)
}
build() {
Column(){
Image($r('app.media.icon_loading_3'))
.width(70)
.height(70)
.rotate({angle:this.angle})
.animation({
duration: 5000,
curve: Curve.Linear,
delay: 0,
iterations: -1, // 设置-1表示动画无限循环
playMode: PlayMode.Normal
})
Text(this.loadingText).fontSize(14).fontColor(0xffffff).margin({top:10})
}.backgroundColor(0x88000000).borderRadius(10).padding({
left:20,right:20,top:10,bottom:10
})
}
}
效果图:

源码下载:
如果您想第一时间看我的后期文章,扫码关注公众号
安辉编程笔记 - 开发技术分享
扫描二维码加关注

鸿蒙(HarmonyOS)常见的三种弹窗方式的更多相关文章
- JavaScript-浏览器的三种弹窗方式
//BOM 弹窗 //同步 阻断 alert("alert弹窗"); //返回布尔值 (是/否) var bcf = confirm("confirm弹窗"); ...
- 数据库常见的三种join方式
数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...
- js里常见的三种请求方式$.ajax、$.post、$.get分析
$.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- Service组件 总结 + 绑定理Service三种实现方式 Messager + Binder + AIDL
在Android中进程按优先级可以分为五类,优先级从高到低排列: - 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity - 可视进程 该进程中的组件虽然没有和用户交互,但是仍 ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- python对mysql数据库操作的三种不同方式
首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- [转]Apache HTTP Server 与 Tomcat 的三种连接方式介绍
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...
随机推荐
- k8s 实战 3----标签
如果你对k8s还不了解,可以看下前文k8s 实战 1 ---- 初识 (https://www.cnblogs.com/jilodream/p/18245222)k8s 实战 2 ---- pod 基 ...
- 洛谷P1747
这个题被坑麻了,题目居然不给棋盘的范围,评论区居然有人说棋盘是无限大的,我想说的是如果真是这样那么第9个点答案应该是2而不是3,这个棋盘绝对是有大小的. #include<iostream> ...
- K8S 中的 CRI、OCI、CRI shim、containerd
哈喽大家好,我是咸鱼. 好久没发文了,最近这段时间都在学 K8S.不知道大家是不是和咸鱼一样,刚开始学 K8S.Docker 的时候,往往被 CRI.OCI.CRI shim.containerd 这 ...
- JDBC第一天:JDBC的基础
第一,JDBC叫java数据库连接技术,是用来实现数据库的增.删.改.查的接口技术. 第二,实现数据库的连接步骤:在这之前需要导包 1,准备四大参数 a,,准备驱动类:driverClassName: ...
- CF30D King's Problem? 题解
CF30D 题意 有 \(n+1\) 个点,其中的 \(n\) 个点在数轴上.求以点 \(k\) 为起点走过所有点的最短距离,允许重复. 思路 有两种情况: \(k\) 在数轴上(如图1). \(k\ ...
- springsecurity流程梳理与总结
springsecurity的基本使用方法学习完了,还是有些懵圈,再回过头来梳理一下流程以及使用情况 1-4.传一个User实体,new一个UserPasswordAuthenticationToke ...
- 从pytest源码的角度分析pytest工作原理
从pytest源码的角度分析pytest工作原理 从 pytest 源代码的角度来分析其工作原理,我们需要关注几个关键的部分,特别是 pytest 的启动过程以及测试的收集与执行.下面是基于 pyte ...
- ubuntu禁止内核自动更新
ubuntu禁止内核自动更新 查看已安装内核dpkg --get-selections |grep linux-image 查看正在使用的内核uname -a 禁止内核更新sudo apt-mark ...
- (计算机类)人工智能方向会议的截止时间表 —— AI Conference Deadlines —— 会议投稿截止时间
由 https://paperswithcode.com/ 提供的时间表. 做AI方向的research,经常需要关注的就是conference的deadline,之前往往都是需要手动的去挨个搜索,下 ...
- DataOps真能“降本增效”?
在各行各业中,越来越多的公司开始重视收集数据,并寻找创新方法来获得真实可行的商业成果,并且愿意投入大量时间和金钱来实现这一目标. 据IDC称,数据和分析软件及云服务市场规模在 2021 年达到了 90 ...