当前位置: 首页 > news >正文

HarmonyOS-ArkUI 自定义弹窗

自定义弹窗

自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中, 布局样式完全由您决定,非常灵活。通常会被封装成工具类,以使得APP中所有弹窗具备相同的设计风格。

自定义弹窗具备的能力有

  • 打开弹窗
  • 自定义布局,以及自定义传参数(通常只要能传参,您就几乎对其界面有绝对的掌控了)
  • 更新弹窗内容
  • 关闭弹窗
  • 释放布局资源

以下能力均可在API图中展现。如果图看明白,基本能掌握比看官方文档还要全面的点。

API

想要让一个自定义弹窗展示,我们首先要获取一个名为 PromptAction类的实例。这个实例由:

getUIContext().getPromptAction()来获取。我们拿到实例之后,就可以看到他里面有比较全面的, 老版本的和新版本的自定义弹窗接口。

下图直接以PromptAction类为切入点。关联所有自定义弹窗需要的API。

代码案例

代码

//用到的自定义数据
interface DialogUIParam {titleText: stringbutton1Text ?: stringbutton2Text ?: stringbutton1Color ?: Color | Resource | stringbutton2Color ?: Color | Resource | string}interface MyCustomDialogParam {uiParam: DialogUIParamonButton1Click: () => voidonButton2Click: () => void
}// 变量
myCustomDialogContent: ComponentContent<Object> | null = null// 调用入口
Text('自定义弹窗').id('customDialog').fontSize($r('app.float.page_text_font_size')).fontWeight(FontWeight.Bold).alignRules({top: { anchor: 'TextPickerDialog', align: VerticalAlign.Bottom },start: { anchor: '__container__', align: HorizontalAlign.Start }}).onClick(() => {this.openCustomDialog()})//打开弹窗openCustomDialog() {// 首先得到promptAction对象let promptAction: PromptAction = this.getUIContext().getPromptAction()if (this.myCustomDialogContent == null) {let uiParam: DialogUIParam = {titleText: '自定义弹窗',button1Text: '点击更新布局',button2Text: '关掉弹窗',button1Color: Color.Blue,button2Color: Color.Red}let param: MyCustomDialogParam = {uiParam: uiParam,onButton1Click: () => {// 更新弹窗的布局param.uiParam.button1Color = Color.Redthis.myCustomDialogContent?.update(param)},onButton2Click: () => {this.closeCustomDialog()}}this.myCustomDialogContent = new ComponentContent(this.getUIContext(),new WrappedBuilder(this.myCustomDialog), param)}let baseDialogOptions: promptAction.BaseDialogOptions = {onDidAppear: () => {console.log("WrappedBuilder 生命周期 onDidAppear触发")},onWillAppear: () => {console.log("WrappedBuilder 生命周期 onWillAppear 触发")},onWillDisappear: () => {console.log("WrappedBuilder 生命周期 onWillDisappear 触发")},onDidDisappear: () => {console.log("WrappedBuilder 生命周期 onDidDisappear 触发")this.myCustomDialogContent?.dispose()this.myCustomDialogContent = null}}promptAction.openCustomDialog(this.myCustomDialogContent, baseDialogOptions)}// 关闭弹窗
closeCustomDialog() {if (this.myCustomDialogContent != null) {this.getUIContext().getPromptAction().closeCustomDialog(this.myCustomDialogContent)}}// builer修饰的组件
@BuildermyCustomDialog(param: MyCustomDialogParam) {Stack() {Column() {Text(param.uiParam.titleText).id('title')if (param.uiParam.button1Text) { //条件渲染Button(param.uiParam.button1Text).id('button1').margin(20).padding({top: 10,bottom: 10,left: 20,right: 20}).onClick(() => {console.log("button1 被点击")param.onButton1Click()}).backgroundColor(param.uiParam.button1Color ? param.uiParam.button1Color : Color.Blue)}if (param.uiParam.button2Text) {Button(param.uiParam.button2Text).id('button2').padding({top: 10,bottom: 10,left: 20,right: 20}).margin({ top: 20 }).onClick(() => {console.log("button2 被点击")//   // 让弹窗消失param.onButton2Click()}).backgroundColor(param.uiParam.button2Color ? param.uiParam.button2Color : Color.Blue)}}.alignSelf(ItemAlign.Center)}.height(200).width(250).backgroundColor(Color.White).borderRadius(15)}

日志

相关文章:

  • echarts在uniapp中使用安卓真机运行时无法显示的问题
  • 第七十四篇 高并发场景下的Java并发容器:用生活案例讲透技术原理
  • 机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化
  • 如何轻松将视频从安卓设备传输到电脑?
  • 【机器学习】主成分分析 (PCA)
  • 视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线
  • 新成果:GaN基VCSEL动态物理模型开发
  • Java Lambda表达式深度解析:从入门到实战
  • AIGC-SD9、知识点
  • 老年生活照护实训室建设规划:照护质量评估与持续改进实训体系
  • Flask-Babel 使用示例
  • ECB(电子密码本,Electronic Codebook) 和 CBC(密码分组链接,Cipher Block Chaining)区分于用途
  • 操作系统中的设备管理,Linux下的I/O
  • 指针的使用——基本数据类型、数组、结构体
  • Rust Floem UI 框架使用简介
  • 【HarmonyOS 5】 影视与直播详以及 开发案例
  • Kafka深度解析与原理剖析
  • 实现单例模式的常见方式
  • 虚实共生时代的情感重构:AI 恋爱陪伴的崛起、困局与明日图景
  • React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用
  • 怎么做猫的静态网站/网站优化推广外包
  • 文案策划的网站/网络推广平台都有哪些
  • 网站视频做栏目一般一期多钱/东莞网站seo技术
  • 医院做网站的费用多少/短视频培训
  • 临朐网站建设建站/软文广告300字范文
  • 微网站建设方案/合肥seo搜索优化