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}`);})}}
}

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

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

相关文章

Java多线程与高并发专题——为何每次用完 ThreadLocal 都要调用 remove()?

什么是内存泄漏 首先&#xff0c;我们要知道这个事情和内存泄漏有关&#xff0c;所以就让我们先来看一下什么是内存泄漏。 内存泄漏指的是&#xff0c;当某一个对象不再有用的时候&#xff0c;占用的内存却不能被回收&#xff0c;这就叫作内存泄漏。 因为通常情况下&#xf…

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…

《笔记》Android 获取第三方应用及查看应用信息、apk大小、缓存、存储,以及第三方清除缓存

获取应用相关信息&#xff1a; PS:manifest标签中设置以下属性表示系统应用 android:process"system" android:sharedUserId"android.uid.system" //获取所有应用&#xff08;非系统apk&#xff0c;有些应用获取不到&#xff09; List<ApplicationInf…

【保姆级教程】Windows系统+ollama+Docker+Anythingllm部署deepseek本地知识库问答大模型,可局域网多用户访问

目录 1.Ollama 本地化部署 DeepSeek R1 1.1下载Ollama 1.2安装Ollama 1.3安装DeepSeek R1大模型 2.系统环境配置 2.1开启系统功能 2.2安装wsl 3.安装 Docker Desktop并拉取Anythingllm镜像 3.1从 Docker 官网 下载并安装。 3.2拉取镜像 3.3运行 Docker 命令 4.anyth…

Sensodrive机器人力控关节模组SensoJoint在海洋垃圾清理机器人中的拓展应用

海洋污染已成为全球性的环境挑战&#xff0c;其中海底垃圾的清理尤为困难。据研究&#xff0c;海洋中约有2600万至6600万吨垃圾&#xff0c;超过90%沉积在海底。传统上&#xff0c;潜水员收集海底垃圾不仅成本高昂&#xff0c;而且充满风险。为解决这一问题&#xff0c;欧盟资助…

【redis】AOF 的基本工作机制,顺序写入,文件同步,重写机制

RDB 最大的问题&#xff0c;就是不能实时的持久化保存数据&#xff0c;在两次生成快照之间&#xff0c;实时的数据可能会随着重启而丢失 基本工作机制 AOF&#xff1a;append only file&#xff0c;类似于 MySQL 的 binlog&#xff0c;会把每个用户的每个操作&#xff0c;都记…

【C++】动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…

数据可视化(matplotlib)-------辅助图标的设置

目录 一、认识图表常用的辅助元素 坐标轴 二、设置坐标轴的标签、刻度范围和刻度标签 &#xff08;一&#xff09;、设置坐标轴的标签 1、xlabel()------设置x轴标签 2、ylabel()------设置y轴标签 &#xff08;二) 、设置刻度范围和刻度标签 1、xlim()和ylim()函数分别可…

CSS 用于图片的样式属性

CSS 设置图像样式 CSS中用于图片的样式属性主要包括以下几个方面&#xff1a; ‌边框和背景‌&#xff1a; ‌border‌&#xff1a;可以设置图片的边框样式、宽度和颜色。例如&#xff0c;img { border: 1px solid #ddd; } 会给图片添加1像素的实线边框&#xff0c;颜色为灰色…

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁&#xff08;强一致&#xff0c;性能差&#xff09; 逻辑过期&#xff08;高可用&#xff0c;性能优&#xff09; 设计逻辑过期时间 引言 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候&#xff0c;恰好这个时间点对…

Object 转 JSONObject 并排除null和““字符串

public static JSONObject objToJSONObject(Object obj) throws Exception{//创建一个 HashMap 对象 map&#xff0c;用于存储对象的属性名和属性值。//key 是属性名&#xff08;String 类型&#xff09;&#xff0c;value 是属性值&#xff08;Object 类型&#xff09;Map<…

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…

C++特性——RAII、智能指针

RAII 就像new一个需要delete&#xff0c;fopen之后需要fclose&#xff0c;但这样会有隐形问题&#xff08;忘记释放&#xff09;。RAII即用对象把这个过程给包起来&#xff0c;对象构造的时候&#xff0c;new或者fopen&#xff0c;析构的时候delete. 为什么需要智能指针 对于…

算法系列——有监督学习——4.支持向量机

一、概述 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种应用范围非常广泛的算法&#xff0c;既可以用于分类&#xff0c;也可以用于回归。 本文将介绍如何将线性支持向量机应用于二元分类问题&#xff0c;以间隔&#xff08;margin&#x…

网络安全之前端学习(HTML篇)

前言&#xff1a;网络安全中有一个漏洞叫xss漏洞&#xff0c;就是利用网页引发弹窗&#xff0c;这就要求我们看得懂源码&#xff0c;所以我会持续更新前端学习&#xff0c;可以不精通&#xff0c;但是一定要会&#xff0c;主要掌握HTML&#xff0c;css&#xff0c;js这三项技术…

大华HTTP协议在智联视频超融合平台中的接入方法

一. 大华HTTP协议介绍 大华HTTP协议是大华股份&#xff08;Dahua Technology&#xff09;为其安防监控设备开发的一套基于HTTP/HTTPS的通信协议&#xff0c;主要用于设备与客户端&#xff08;如PC、手机、服务器&#xff09;之间的数据交互。该协议支持设备管理、视频流获取、…

介绍一下TiDB、RocksDb、levelDB、LSM 树、SSTable。

LSM 树&#xff08;Log-Structured Merge-Tree&#xff09; 核心原理&#xff1a;通过将随机写转换为顺序写优化写入性能&#xff0c;适用于写密集型场景。数据首先写入内存中的 MemTable&#xff08;有序结构&#xff0c;如跳表&#xff09;&#xff0c;当达到阈值后转为 Imm…

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…

Jmeter

Jmeter 官网地址 https://jmeter.apache.org/ 下载安装包 系统环境变量 变量值JMETER_HOMEG:\Application\apache-jmeter-5.6.3 修改成自己的安装目录CLASSPATH;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar;Path%JMETER_HOME%\bin 中文界…

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…