【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口,通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前,用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能,弹窗按照功能可以分为以下两类:

  • 确认类:例如警告弹窗 AlertDialog。

  • 选择类:包括文本选择弹窗 TextPickerDialog 、日期滑动选择弹窗 DatePickerDialog、时间滑动选择弹窗 TimePickerDialog 等。

您可以根据业务场景,选择不同类型的弹窗。

参考:OpenHarmony 弹窗文档V4.0

 今天我们主要了解一下自定义弹窗的使用

自定义弹窗

自定义弹窗的使用更加灵活,适用于更多的业务场景,在自定义弹窗中您可以自定义弹窗内容,构建更加丰富的弹窗界面。自定义弹窗的界面可以通过装饰器@CustomDialog 定义的组件来实现,然后结合 CustomDialogController 来控制自定义弹窗的显示和隐藏。

1、定义自定义弹窗

@CustomDialog
struct CustomDialogExample {// 双向绑定传值@Prop title: string@Link inputValue: string// 弹窗控制器,控制打开/关闭,必须传入,且名称必须为:controllercontroller: CustomDialogController// 弹窗中的按钮事件cancel: () => voidconfirm: () => void// 弹窗中的内容描述build() {Column() {Text(this.title || "是否修改文本框内容?").fontSize(16).margin(24).textAlign(TextAlign.Start).width("100%")TextInput({ placeholder: '文本输入框', text: this.inputValue}).height(60).width('90%').onChange((value: string) => {this.textValue = value})Flex({ justifyContent: FlexAlign.SpaceAround }) {Button('取消').onClick(() => {this.controller.close()this.cancel()}).backgroundColor(0xffffff).fontColor(Color.Black)Button('确定').onClick(() => {this.controller.close()this.confirm()}).backgroundColor(0xffffff).fontColor(Color.Red)}.margin({ bottom: 10 })}}
}

2、使用自定义弹窗

@Entry
@Component
struct Index {@State title: string = '标题'@State inputValue: string = '文本框父子组件数据双绑'// 定义自定义弹窗的Controller,传入参数和回调函数dialogController: CustomDialogController = new CustomDialogController({builder: CustomDialogExample({cancel: this.onCancel,confirm: this.onAccept,textValue: $textValue,inputValue: $inputValue}),cancel: this.existApp,autoCancel: true,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -20 },gridCount: 4,customStyle: false})aboutToDisappear() {this.dialogController = undefined // 将dialogController置空}onCancel() {console.info('点击取消按钮', this.inputValue)}onAccept() {console.info('点击确认按钮', this.inputValue)}build() {Column() {Button('打开自定义弹窗').width('60%').margin({top:320}).zIndex(999).onClick(()=>{if (this.dialogController != undefined) {this.dialogController.open()}})}.height('100%').width('100%')
}

3、一个完整的示例(常用网站选择)

export interface HobbyBean {label: string;isChecked: boolean;
}export type DataItemType = { value: string }@Extend(Button) function dialogButtonStyle() {.fontSize(16).fontColor("#007DFF").layoutWeight(1).backgroundColor(Color.White).width(500).height(40)
}@CustomDialog
struct CustomDialogWidget {@State hobbyBeans: HobbyBean[] = [];@Prop title:string;@Prop hobbyResult: Array<DataItemType>;@Link hobbies: string;private controller: CustomDialogController;setHobbiesValue(hobbyBeans: HobbyBean[]) {let hobbiesText: string = '';hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>isCheckItem?.isChecked).map((checkedItem: HobbyBean) => {return checkedItem.label;}).join(',');this.hobbies = hobbiesText;}aboutToAppear() {// let context: Context = getContext(this);// let manager = context.resourceManager;// manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {// });this.hobbyResult.forEach(item => {const hobbyBean = {label: item.value,isChecked: this.hobbies.includes(item.value)}this.hobbyBeans.push(hobbyBean);});}build() {Column() {Text(this.title || "兴趣爱好").fontWeight(FontWeight.Bold).alignSelf(ItemAlign.Start).margin({ left: 24, bottom: 12 })List() {ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {ListItem() {Row() {Text(itemHobby.label).fontSize(16).fontColor("#182431").layoutWeight(1).textAlign(TextAlign.Start).fontWeight(500).margin({ left: 24 })Toggle({ type: ToggleType.Checkbox, isOn: itemHobby.isChecked }).margin({right: 24}).onChange((isCheck) => {itemHobby.isChecked = isCheck;})}}.height(36)}, itemHobby => itemHobby.label)}.margin({top: 6,bottom: 8}).divider({strokeWidth: 0.5,color: "#0D182431"}).listDirection(Axis.Vertical).edgeEffect(EdgeEffect.None).width("100%")// .height(248)Row({space: 20}) {Button("关闭").dialogButtonStyle().onClick(() => {this.controller.close();})Blank().backgroundColor("#F2F2F2").width(1).opacity(1).height(25)Button("保存").dialogButtonStyle().onClick(() => {this.setHobbiesValue(this.hobbyBeans);this.controller.close();})}}.width("93.3%").padding({top: 14,bottom: 16}).borderRadius(32).backgroundColor(Color.White)}
}@Entry
@Component
struct HomePage {@State hobbies: string = '';@State hobbyResult: Array<DataItemType> = [{"value": "FaceBook"},{"value": "Google"},{"value": "Instagram"},{"value": "Twitter"},{"value": "Linkedin"}]private title: string = '常用网站'customDialogController: CustomDialogController = new CustomDialogController({builder: CustomDialogWidget({hobbies: $hobbies,hobbyResult: this.hobbyResult,title: this.title}),alignment: DialogAlignment.Bottom,customStyle: true,offset: { dx: 0,dy: -20 }});build() {Column() {Button('打开自定义弹窗').width('60%').margin({top: 50}).zIndex(999).onClick(()=>{if (this.customDialogController != undefined) {this.customDialogController.open()}})Text(this.hobbies).fontSize(16).padding(24)}.width('100%')}
}

参考:https://gitee.com/harmonyos/codelabs/tree/master/MultipleDialog

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信自动登录自定义系统

方法一&#xff1a;企业微信构造OAuth2链接跳转登录到自定义系统 企业微信自定义应用配置 构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/…

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…

“最美中国女生”——AI绘画还没上车的有难了!!!

废话少说&#xff0c;先上图&#xff01;&#xff01;&#xff01; 前段时间&#xff0c;ChatGPT生成了一张自诩为“最美的中国女生”。虽然审美是主观的&#xff0c;但不可否认&#xff0c;图片的客观美。不过——你不会还只是看到图片里的美女&#xff0c;肤浅地欣赏高颜值吧…

Java_正则表达式

正则表达式 接下来&#xff0c;我们学习一个全新的知识&#xff0c;叫做正则表达式。正则表达式其实是由一些特殊的符号组成的&#xff0c;它代表的是某种规则。 正则表达式的作用1&#xff1a;用来校验字符串数据是否合法 正则表达式的作用2&#xff1a;可以从一段文本中查找…

JavaOOP篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、一个java类中包含那些内容&#xff1f;二、那针对浮点型数据运算出现的误差的问题&#xff0c;你怎么解决&#xff1f;三、面向对象的特征有哪些方面?四、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff0…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

luttuce(RedisTempate)实现hash(动态数据) expire lua脚本

话不多说先放脚本&#xff1a; local argv ARGV local length #argv if length > 0 then local unpackArgs {} for i 1, length - 1 dotable.insert(unpackArgs, argv[i]) end if redis.call(exists, KEYS[1]) 1 thenredis.call(del, KEYS[1])redis.call(hset, KEYS[…

Opencv C++ 绘制中文

零、源码 GitHub - ITC-AI/Opencv_Chinese: C 的 Opencv绘制中文 一、代码编写 参考 https://blog.csdn.net/long630576366/article/details/131440684 1、cvxFont.h #ifndef OPENCVUNICODE_CVXFONT_H #define OPENCVUNICODE_CVXFONT_H#include <ft2build.h> #inclu…

RabbitMQ入门指南(一):初识与安装

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消息队列介绍 1.同步调用和异步调用 2.常见消息队列介绍 二、RabbitMQ简介及其安装步骤 1.RabbitMQ简介 2.RabbitMQ安装步骤&#xff08;使用Docker&#xff09; (1) 创建网络 (2) 使用Docker来…

【LeetCode:1901. 寻找峰值 II | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

初识Python之Networkx模块

初识Python之Networkx模块 文章目录 初识Python之Networkx模块简介安装Networkx导入模块、查看版本信息一些基本操作创建Graph添加边&#xff08;节点&#xff09;获取Graph的基本信息Graph的基本绘图 简单应用案例使用内置的Graph数据创建一个无向图创建一个有向图在计算机网络…