HarmonyOS Next中的弹出框使用

HarmonyOS Next弹出框概述及分类
弹出框是一种模态窗口,通常用于在保持当前上下文环境的同时,临时展示用户需关注的信息或待处理的操作。用户需在模态弹出框内完成相关交互任务之后,才能退出模态模式。弹出框可以不与任何组件绑定,其内容通常由多种组件组成,如文本、列表、输入框、图片等,以实现布局。ArkUI当前提供了自定义和固定样式两类弹出框组件。
- 自定义弹出框: 开发者需要根据使用场景,传入自定义组件填充在弹出框中实现自定义的弹出框内容。主要包括基础自定义弹出框 (CustomDialog)、不依赖UI组件的自定义弹出框 (openCustomDialog)。
- 固定样式弹出框: 开发者可使用固定样式弹出框,指定需要显示的文本内容和按钮操作,完成简单的交互效果。主要包括警告弹窗 (AlertDialog)、列表选择弹窗 (ActionSheet)、选择器弹窗 (PickerDialog)、对话框 (showDialog)、操作菜单 (showActionMenu)。
本文主要是介绍自定义弹出框的使用,固定样式弹出框可以参考官方文档,自定义弹出框主要有两种实现方式:
1、基础自定义弹出框 (CustomDialog)(不推荐)
2、不依赖UI组件的全局自定义弹出框 (openCustomDialog)(推荐)
基础自定义弹出框 (CustomDialog)
CustomDialog是自定义弹出框,可用于广告、中奖、警告、软件更新等与用户交互响应操作。通过CustomDialogController类显示自定义弹窗。使用弹窗组件时,可优先考虑自定义弹窗,便于自定义弹窗的样式与内容。
1、@CustomDialog装饰器
使用@CustomDialog装饰器装饰自定义弹出框,可在此装饰器内自定义弹出框内容。这里在装饰器内添加确定和取消按钮,也可以同时添加数据函数。
@CustomDialog
struct CustomDialogExample {cancel?: () => voidconfirm?: () => voidcontroller: CustomDialogControllerbuild() {Column() {Text('我是内容').fontSize(20).margin({ top: 10, bottom: 10 })Flex({ justifyContent: FlexAlign.SpaceAround }) {Button('cancel').onClick(() => {this.controller.close()if (this.cancel) {this.cancel()}}).backgroundColor(0xffffff).fontColor(Color.Black)Button('confirm').onClick(() => {this.controller.close()if (this.confirm) {this.confirm()}}).backgroundColor(0xffffff).fontColor(Color.Red)}.margin({ bottom: 10 })}}
}
创建构造器,与装饰器呼应相连。页面内需要在构造器内进行接收,同时创建相应的函数操作。
@Entry
@Component
struct CustomDialogUser {dialogController: CustomDialogController = new CustomDialogController({builder: CustomDialogExample({cancel: ()=> { this.onCancel() },confirm: ()=> { this.onAccept() },}),})onCancel() {console.info('Callback when the first button is clicked')}onAccept() {console.info('Callback when the second button is clicked')}build() {Column() {Button('click me').onClick(() => {this.dialogController.open()})}.width('100%').margin({ top: 5 })}
}
2、CustomContentDialog
使用CustomContentDialog自定义弹出框,可在此自定义内容区弹出框,同时支持定义操作区按钮样式。从API version 12开始支持使用。
| 名称 | 类型 | 必填 | 装饰器类型 | 说明 |
| controller | CustomDialogController | 是 | - | 弹出框控制器。 说明: 未使用@Require装饰,构造时不强制校验参数。 |
| contentBuilder | () => void | 是 | @BuilderParam | 弹出框内容。 |
| primaryTitle | ResourceStr | 否 | - | 弹出框标题。 |
| secondaryTitle | ResourceStr | 否 | - | 弹出框辅助文本。 |
| localizedContentAreaPadding | LocalizedPadding | 否 | - | 弹出框内容区内边距。 |
| contentAreaPadding | Padding | 否 | - | 弹出框内容区内边距。设置了localizedContentAreaPadding属性时该属性不生效。 |
| buttons | ButtonOptions[] | 否 | - | 弹出框操作区按钮,最多支持4个按钮。 |
| theme | Theme| CustomTheme | 否 | - | 主题信息,可以是CustomTheme或从onWillApplyTheme中获取的Theme实例。 |
| themeColorMode | ThemeColorMode | 否 | - | 自定义弹窗深浅色模式。 |
支持自定义内容弹出框,包含contentBuilder、buttons等内容。和@CustomDialog装饰器一样,CustomContentDialog也可以添加按钮和数据,如果需要完全自定义弹框样式,可以只设置contentBuilder函数参数用来实现自定义弹框。
import { CustomContentDialog } from '@kit.ArkUI'@Entry
@Component
struct Index {dialogController: CustomDialogController = new CustomDialogController({builder: CustomContentDialog({primaryTitle: '标题',secondaryTitle: '辅助文本',contentBuilder: () => {this.buildContent();},buttons: [{ value: '按钮1',buttonStyle: ButtonStyleMode.TEXTUAL, action: () => {console.info('Callback when the button is clicked')}},{value: '按钮2',buttonStyle: ButtonStyleMode.TEXTUAL,role: ButtonRole.ERROR}],}),});build() {Column() {Button("支持自定义内容弹出框").onClick(() => {this.dialogController.open()})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}// 自定义弹出框的内容区@BuilderbuildContent(): void {Column() {Text('内容区')}.width('100%')}
}
不依赖UI组件的全局自定义弹出框 (openCustomDialog)
先对于CustomDialogController,官方更推荐我们使用openCustomDialog来实现自定义弹出框。
由于CustomDialogController在使用上存在诸多限制,不支持动态创建也不支持动态刷新,在相对较复杂的应用场景中推荐使用UIContext中获取到的PromptAction对象提供的openCustomDialog接口来实现自定义弹出框。
弹出框(openCustomDialog)存在两种入参方式创建自定义弹出框:
- openCustomDialog(传参为ComponentContent形式):通过ComponentContent封装内容可以与UI界面解耦,调用更加灵活,可以满足开发者的封装诉求。拥有更强的灵活性,弹出框样式是完全自定义的,且在弹出框打开之后可以使用updateCustomDialog方法动态更新弹出框的一些参数。
- openCustomDialog(传builder的形式):相对于ComponentContent,builder必须要与上下文做绑定,与UI存在一定耦合。此方法有用默认的弹出框样式,适合于开发者想要实现与系统弹窗默认风格一致的效果。
1、初始化弹出框配置
获取PromptAction对象,初始化弹出框配置,可在配置中修改弹窗位置,动画等相关配置。
创建ComponentContent,ComponentContent用于定义自定义弹出框的内容。其中,wrapBuilder(radioDialogView)封装自定义组件。
// 设置对话框内容组件(支持链式调用)init(context: UIContext, radioSelectBean: RadioSelectBean): RadioAppDialog {this.contentNode = new ComponentContent(context, wrapBuilder<[RadioSelectBean]>(radioDialogView), radioSelectBean);this.promptAction = context.getPromptAction();this.options = {alignment: DialogAlignment.Bottom,transition: TransitionEffect.move(TransitionEdge.BOTTOM).animation({ duration: 300 }),}return this}
2、打开自定义弹出框。
通过调用openCustomDialog接口打开的弹出框默认为customStyle为true的弹出框,即弹出框的内容样式完全按照contentNode自定义样式显示。
// 显示自定义对话框show() {if (this.contentNode !== null) {this.promptAction?.openCustomDialog(this.contentNode, this.options).then(() => {console.info('打开自定义对话框完成')}).catch((error: BusinessError) => {// 错误处理:获取错误码和信息let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`打开对话框参数错误,错误码:${code},信息:${message}`);})}}
3、关闭自定义弹出框
关闭弹出框之后若需要释放对应的ComponentContent,则需要调用ComponentContent的dispose方法。
tip:关闭弹出框需要传人待关闭的ComponentContent对象。
// 关闭自定义对话框close() {if (this.contentNode !== null) {this.promptAction?.closeCustomDialog(this.contentNode).then(() => {this.contentNode?.dispose()console.info('关闭自定义对话框完成')}).catch((error: BusinessError) => {let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`关闭对话框参数错误,错误码:${code},信息:${message}`);})}}
4、更新自定义弹出框的内容
若需要更新弹出框中自定义组件的内容可以通过ComponentContent提供的update方法来实现。这里传人的数据对象就事显示的时候传人的数据。
//更新对话框数据updateData(radioSelectBean: RadioSelectBean) {this.contentNode?.update(radioSelectBean)}
5、完整代码
// 导入ArkUI的对话框操作模块和基础服务错误类型
import { ComponentContent, curves, PromptAction, promptAction } from "@kit.ArkUI";
import { BusinessError } from "@kit.BasicServicesKit";
import { RadioSelectBean } from "../model/HomeModel";
import { radioDialogView } from "../view/GlobalBuildView";// 自定义单选对话框类
export class RadioAppDialog {// 单例实例private static instance: RadioAppDialog;// 静态属性声明contentNode?: ComponentContent<Object>; // 对话框内容组件options?: promptAction.BaseDialogOptions; // 对话框基础配置选项promptAction?: PromptAction// 私有化构造函数private constructor() {console.info('创建自定义对话框单例');}/*** 获取单例实例(静态方法)* @returns 返回全局唯一实例*/public static getInstance(): RadioAppDialog {if (!RadioAppDialog.instance) {RadioAppDialog.instance = new RadioAppDialog();}return RadioAppDialog.instance;}/*** 重置单例实例(用于测试或特殊场景)*/public static resetInstance(): void {RadioAppDialog.instance = new RadioAppDialog();}// 设置对话框内容组件(支持链式调用)init(context: UIContext, radioSelectBean: RadioSelectBean): RadioAppDialog {this.contentNode = new ComponentContent(context, wrapBuilder<[RadioSelectBean]>(radioDialogView), radioSelectBean);this.promptAction = context.getPromptAction();this.options = {alignment: DialogAlignment.Bottom,transition: TransitionEffect.move(TransitionEdge.BOTTOM).animation({ duration: 300 }),}return this}// 设置对话框选项(支持链式调用)setOptions(options: promptAction.BaseDialogOptions): RadioAppDialog {this.options = options;return this;}//更新对话框数据updateData(obj?: Object) {this.contentNode?.update(obj)}// 显示自定义对话框show() {if (this.contentNode !== null) {this.promptAction?.openCustomDialog(this.contentNode, this.options).then(() => {console.info('打开自定义对话框完成')}).catch((error: BusinessError) => {// 错误处理:获取错误码和信息let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`打开对话框参数错误,错误码:${code},信息:${message}`);})}}// 关闭自定义对话框close() {if (this.contentNode !== null) {this.promptAction?.closeCustomDialog(this.contentNode).then(() => {this.contentNode?.dispose()console.info('关闭自定义对话框完成')}).catch((error: BusinessError) => {let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`关闭对话框参数错误,错误码:${code},信息:${message}`);})}}// 更新对话框配置updateDialog(options: promptAction.BaseDialogOptions) {if (this.contentNode !== null) {this.promptAction?.updateCustomDialog(this.contentNode, options).then(() => {console.info('更新对话框配置完成')}).catch((error: BusinessError) => {let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`更新对话框参数错误,错误码:${code},信息:${message}`);})}}
}相关文章:
HarmonyOS Next中的弹出框使用
HarmonyOS Next弹出框概述及分类 弹出框是一种模态窗口,通常用于在保持当前上下文环境的同时,临时展示用户需关注的信息或待处理的操作。用户需在模态弹出框内完成相关交互任务之后,才能退出模态模式。弹出框可以不与任何组件绑定࿰…...
C++实现的数据结构示例,涵盖链表、数组、树和图
使用C实现的数据结构示例,涵盖链表、数组、树和图的基本操作: 链表(单向链表) #include <iostream> using namespace std;struct Node {int data;Node* next;Node(int val) : data(val), next(nullptr) {} };class Linked…...
FPGA中级项目4——DDS实现
FPGA中级项目4——DDS实现 DDS简介 DDS(直接数字频率合成器,Direct Digital Frequency Synthesis)是一种基于数字信号处理技术的频率合成方法,广泛应用于通信、雷达、仪器仪表等领域。在 FPGA中实现 DDS 具有灵活性高、集成度强、…...
深度学习-149-langchain之如何不使用with_structured_output()从模型中返回结构化数据
文章目录 1 不使用with_structured_output()方法1.1 问题背景1.2 输出解析器1.3 远程deepseek大模型API2 基于提示词2.1 直接使用提示词2.2 少样本提示词3 直接提示和解析模型输出3.1 使用PydanticOutputParser3.1.1 构建解析器3.1.2 构建提示模板3.1.3 调用大模型3.1.4 调用链…...
STM32 DAC详解:从原理到实战输出正弦波
目录 一、DAC基础原理1.1 DAC的作用与特性1.2 DAC功能框图解析 二、DAC配置步骤2.1 硬件配置2.2 初始化结构体详解 三、DAC数据输出与波形生成3.1 数据格式与电压计算3.2 正弦波生成实战3.2.1 生成正弦波数组3.2.2 配置DMA传输3.2.3 定时器触发配置 四、常见问题与优化建议4.1 …...
深度学习框架PyTorch——从入门到精通(5)构建神经网络
构建神经网络 获取训练设备定义类模型层nn.Flattennn.Linearnn.ReLUnn.Sequentialnn.Softmax 模型参数补充说明argmax 神经网络是由一些层或者模块组成的,这些层和模块会对数据进行各种操作。 在 PyTorch 里,torch.nn 这个命名空间提供了你搭建自己神经网…...
基于PyQt5与Open3D的轻量化BIM工具开发指南(下)
基于PyQt5与Open3D的轻量化BIM工具开发指南(下) ——参数化建模、数据导出与性能优化 【跳转】基于PyQt5与Open3D的轻量化BIM工具开发指南(上) 四、详细实现步骤(Part 2) 3. 参数化建模…...
Pytest项目_day01(HTTP接口)
HTTP HTTP是一个协议(服务器传输超文本到浏览器的传送协议),是基于TCP/IP通信协议来传输数据(HTML文件,图片文件,查询结果等)。 访问域名 例如www.baidu.com就是百度的域名,我们想…...
在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态
目录 前言 一.问题描述 二.后端实现 1.分析 2.检查后端拦截器,看看是否允许接收Patch类型的请求 3.编写Dto 4.编写controller层 5.编写service层 6.mapper层 7.使用apifox,测试后端接口的可用性 三.前端实现 1.封装api(本质是ax…...
Android Zygote的进程机制
目录 ✅ Android Zygote 进程机制详解 🚩 一、Zygote 的作用 ⚙️ 二、Zygote 启动流程 ✅ 1. init 进程启动 Zygote ✅ 2. Zygote 初始化虚拟机与核心类库 ✅ 3. Zygote 监听 Socket ✅ 4. Zygote fork 创建应用进程 🔥 三、Zygote 与应用进程之…...
某快餐店用户市场数据挖掘与可视化
1、必要库的载入 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns2、加载并清洗数据 # 2.1 加载数据 df pd.read_csv(/home/mw/input/survey6263/mcdonalds.csv)# 2.2 数据清洗 # 2.2.1 检查缺失值 print(缺失值情况:) print(df.isn…...
[C++面试] 标准容器面试点
一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组,它将元素存储在连续的内存空间中。支持随机访问,即可以通过下标快速访问任意位置的元素,时间复杂度为 O(1),准确点是均摊O(1)。但在中间或开头插…...
单片机学完开发板,如何继续提升自己的技能?
很多人学完开发板后都会卡在一个尴尬的阶段:觉得自己会的东西不少,但又不知道下一步该干啥。会点C语言,能烧录程序,能点亮LED,玩转按键,搞定串口等等,能用开发板做点小玩意儿,但面对…...
luogu「EZEC-10」打分 --- Python3 解法
题目链接: 「EZEC-10」打分 import sysdef max_score(n, m, scores):scores.remove(min(scores)) # 最小值的选取,不影响中间部分的处理scores.sort()max_ scores[-1]sum_ sum(scores[:-1]) # 中间部分len_ len(scores)needed (len_ - 1) * max_ …...
MySQL事务介绍
一、一个典型的事务场景 步骤操作描述SQL 语句1开启事务,确保转账操作的原子性START TRANSACTION;2从用户 A 的账户中扣除 100 元UPDATE account SET balance balance - 100 WHERE user A;3向用户 B 的账户中添加 100 元UPDATE account SET balance balance 1…...
明基PD2700U显示器无法调节图像模式
现象:明基PD2700U显示器无法调节图像模式,如下图: 目前未找到根本原因,推测可能是下面的原因: 1、安装了远程桌面软件:向日葵、虚拟显示器 2、显卡插入了接口,但是没接显示器 解决办法…...
基于FPGA轨道交通6U机箱CPCI脉冲板板卡
板卡简介: 本板为脉冲板,脉冲板主要执行CPU下达的指令,通过实现各种控制算法来调节PWM,然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格: 电源:DC5V;15V FPGA&…...
SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
背景: 添加spring-jdbc依赖时,原来是指定版本的,担心版本冲突,就改成依赖托管,悲剧的是反复reload和mvn clean,import到类的该包一直标红,提示jar包找不到。。。 解决方案: Idea左上…...
如何通过 Airbyte 将数据摄取到 Elasticsearch
作者:来自 Elastic Andre Luiz Airbyte 是一个数据集成工具,可自动化并可扩展地将信息从各种来源传输到不同的目的地。它使你能够从 API、数据库和其他系统提取数据,并将其加载到 Elasticsearch 等平台,以实现高级搜索和高效分析。…...
配置 VSCode 的 C# 开发环境
1. 安装必要的依赖 1.1 VSCode 扩展 安装 C# 相关插件(如 C#、C# Extensions 等)。 1.2 .NET SDK 下载地址:.NET SDK 下载页面 1.3 安装检测 在命令行输入以下命令,如果正确返回了版本号,则表示 .NET SDK 安装成…...
如何用DeepSeek进行项目管理?AI重构项目全生命周期的实践指南
一、项目管理的核心工作范畴 现代项目管理包含六大核心模块,构成完整管理闭环: 1. 需求管理(20%工作量) 案例:某电商平台"双11"大促项目需整合23个部门的142项需求 关键动作:需求收集→优先级…...
Git 回退操作详解:带示例的“小白”指南
前言 在日常开发中,我们难免会遇到: 改错代码:推送之前才发现某些行根本就不该动提交错误:commit 信息打错、提交到错误分支想回到之前版本:测试时发现之前版本是好的,需要回去查看 这就需要用到 Git 的…...
vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法
1、element-plus官方地址 一个 Vue 3 UI 框架 | Element Plus 2、安装 安装 | Element Plus 3、安装插件unplugin-vue-components、unplugin-auto-import并配制 快速开始 | Element Plus 4、输入关键词没有提示及ElButton:unknown的处理 1)装个扩展插件…...
如何让焦虑为城市供能 | 杂谈
凌晨两点,我盯着满桌冷掉的碳烤磷虾烩面——这顿价值500星币的宵夜。当冒充食客的就餐员像幽灵般消失后,躁动的神经末梢突然刺破迷雾:那些令人窒息的负能量,是否能在量子层面转化为清洁动能? 这个疯狂假设打开了四维能…...
【Linux】浅谈环境变量和进程地址空间
一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…...
如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索
作者:来自 Elastic Kritin Vongthongsri 学习如何使用 DeepEval 优化 RAG 流水线中的 Elasticsearch 检索器。 LLMs 容易产生幻觉、缺乏特定领域的专业知识,并受限于上下文窗口。检索增强生成(Retrieval-Augmented Generation - RAGÿ…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
嵌入式裸机设计--MCU常用裸机架构有哪些?
为什么是裸机设计 792125321入群学习更高效! 在MCU(微控制器单元)裸机开发中,我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式,对我们开发一个小型项目来说及有好处! 下面介绍…...
【LInux进程六】命令行参数和环境变量
【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一:PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…...
深度解析前端面试八股文:核心知识点与高效应对策略
深度解析前端面试八股文:核心知识点与高效应对策略 1. 引言 前端面试是每位开发者迈向职业进阶的重要环节,涉及 HTML、CSS、JavaScript、性能优化、浏览器原理、网络、安全、框架(Vue/React) 等核心知识点。本文不仅会覆盖 前端…...
