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

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

日志

http://www.xdnf.cn/news/12103.html

相关文章:

  • 企业im,为企业设计的私有化即时通讯工具
  • [蓝桥杯]修改数组
  • 智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?
  • 塑料回收新突破!Nature 重磅:2 小时解聚碳纤维废料
  • 筑牢企业网管域安全防线,守护数字核心——联软网管域安全建设解决方案
  • SEO长尾关键词优化实战解析
  • AMFCNN-RKD:齿轮故障诊断的轻量级多传感器融合模型详解(python代码复现)
  • pbootcms文章加了浏览权限后出现404错误
  • 【芯片仿真中的X值:隐藏的陷阱与应对之道】
  • NoSQL——Redis配置与优化
  • python技巧:pyvisa打开hislip设备;IEEE 488.2
  • centos查看开启关闭防火墙状态
  • 电子行业AI赋能软件开发经典案例——某金融软件公司
  • 平安养老险蚌埠中心支公司开展金融宣教活动
  • C++定长内存块的实现
  • 【Redis】zset 类型
  • 在 CentOS 上将 Ansible 项目推送到 GitHub 的完整指南
  • 佰力博科技与您探讨压电d33测试有哪些注意事项
  • PySpark性能调优手册:大数据处理中的避坑与实践
  • HTML5+CSS3+JS小实例:具有粘性重力的磨砂玻璃导航栏
  • 航道无人机巡检系统
  • 【HarmonyOS 5】 社交行业详解以及 开发案例
  • vue3+ts+vite:详细、完整的 tsconfig.json 示例 / 常见配置项及其用途
  • React Navive初识
  • 强化学习原理入门-2马尔科夫决策过程
  • sentinel规则持久化
  • Postgresql常用函数操作
  • 详解如何通过playwright的 page.eval_on_selector_all() 方法来爬取网页中link进而实现爬虫
  • 动态规划-1035.不相交的线-力扣(LeetCode)
  • Index-TTS-1.5:多模态AI语音生成的革新突破