HarmonyOS 5.0应用开发——全局自定义弹出框openCustomDialog

【高心星出品】

文章目录

全局自定义弹出框openCustomDialog

CustomDialog是自定义弹出框,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹出框。

但是使用起来有很多问题,不支持动态创建也不支持动态刷新,在相对较复杂的应用场景中推荐使用UIContext中获取到的PromptAction对象提供的openCustomDialog接口来实现自定义弹出框。

openCustomDialog(传参为ComponentContent形式):通过ComponentContent封装内容可以与UI界面解耦,调用更加灵活,可以满足开发者的封装诉求。拥有更强的灵活性,弹出框样式是完全自定义的,且在弹出框打开之后可以使用updateCustomDialog方法动态更新弹出框的一些参数。

案例

下面将写一个案例,点击按钮弹出自定义对话框,并且可以动态修改对话框的位置和内容。

运行结果

开发步骤

全局对话框弹出工具

里面只需要UIContext,ComponentContent和对话框配置option。

里面有打开对话框,关闭对话框和更新对话框的方法。

复制代码
class customdialogutil {
  // UI上下文环境
  private static uicontext: UIContext

  public static setuicontext(value: UIContext) {
    customdialogutil.uicontext = value
  }

  // 对话框显示的内容
  private static content: ComponentContent<Object>

  public static setcontent(value: ComponentContent<object>) {
    customdialogutil.content = value
  }

  // 弹出对话框的配置
  private static option: promptAction.ShowDialogOptions

  public static setoption(value: promptAction.ShowDialogOptions) {
    customdialogutil.option = value
  }

  // 打开弹出框
  static open() {
    customdialogutil.uicontext.getPromptAction()
      .openCustomDialog(customdialogutil.content, customdialogutil.option)
      .catch((err: Error) => {
        console.error('gxxt ', err.message)
      })
  }

  // 关闭弹出框
  static close() {
    customdialogutil.uicontext.getPromptAction().closeCustomDialog(customdialogutil.content).catch((err: Error) => {
      console.error('gxxt ', err.message)
    })
  }

  // 更新弹出框内容或这样式
  static update(nopt: promptAction.ShowDialogOptions) {
    customdialogutil.uicontext.getPromptAction()
      .updateCustomDialog(customdialogutil.content, nopt)
      .catch((err: Error) => {
        console.error('gxxt ', err.message)
      })
  }
}

生成对话框界面的构建函数

复制代码
interface param {
  message: string
  updck: () => void
  closeck: () => void
}

@Builder
function dialogcontent(p: param) {
  Column({ space: 20 }) {
    Text(p.message).fontSize(20).fontWeight(FontWeight.Bolder)
    Row() {
      Button('更新').onClick(p.updck)
      Button('关闭').onClick(p.closeck)
    }
    .justifyContent(FlexAlign.SpaceAround)
    .width('100%')
  }
  .padding(20)
  .backgroundColor(Color.White)
  .width('80%')
  .borderRadius(20)
}

页面代码

复制代码
@Entry
@Component
struct CustomdialogPage {
  build() {
    Column() {
      Button('弹出框')
        .width('60%')
        .onClick(() => {
          // 设置ui上下文环境
          customdialogutil.setuicontext(this.getUIContext())
          // 第一个builder构建函数生成的compoentcontent
          let content: ComponentContent<param> =
            new ComponentContent<param>(this.getUIContext(), wrapBuilder<[param]>(dialogcontent), {
              message: '自定义对话框内容1', updck: () => {
                // 更新对话框的位置
                customdialogutil.update({ alignment: DialogAlignment.Top, offset: { dy: 100, dx: 0 } })
              }, closeck: () => {
                // 关闭对话框
                customdialogutil.close()
              }
            })
          // 设置第一个构建函数的componentcontent
          customdialogutil.setcontent(content)
          customdialogutil.setoption({})
          // 打开对话框
          customdialogutil.open()
        })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}
完整代码
复制代码
import { ComponentContent, promptAction, typeNode } from '@kit.ArkUI'

class customdialogutil {
  // UI上下文环境
  private static uicontext: UIContext

  public static setuicontext(value: UIContext) {
    customdialogutil.uicontext = value
  }

  // 对话框显示的内容
  private static content: ComponentContent<Object>

  public static setcontent(value: ComponentContent<object>) {
    customdialogutil.content = value
  }

  // 弹出对话框的配置
  private static option: promptAction.ShowDialogOptions

  public static setoption(value: promptAction.ShowDialogOptions) {
    customdialogutil.option = value
  }

  // 打开弹出框
  static open() {
    customdialogutil.uicontext.getPromptAction()
      .openCustomDialog(customdialogutil.content, customdialogutil.option)
      .catch((err: Error) => {
        console.error('gxxt ', err.message)
      })
  }

  // 关闭弹出框
  static close() {
    customdialogutil.uicontext.getPromptAction().closeCustomDialog(customdialogutil.content).catch((err: Error) => {
      console.error('gxxt ', err.message)
    })
  }

  // 更新弹出框内容或这样式
  static update(nopt: promptAction.ShowDialogOptions) {
    customdialogutil.uicontext.getPromptAction()
      .updateCustomDialog(customdialogutil.content, nopt)
      .catch((err: Error) => {
        console.error('gxxt ', err.message)
      })
  }
}

interface param {
  message: string
  updck: () => void
  closeck: () => void
}

@Builder
function dialogcontent(p: param) {
  Column({ space: 20 }) {
    Text(p.message).fontSize(20).fontWeight(FontWeight.Bolder)
    Row() {
      Button('更新').onClick(p.updck)
      Button('关闭').onClick(p.closeck)
    }
    .justifyContent(FlexAlign.SpaceAround)
    .width('100%')
  }
  .padding(20)
  .backgroundColor(Color.White)
  .width('80%')
  .borderRadius(20)
}


@Entry
@Component
struct CustomdialogPage {
  build() {
    Column() {
      Button('弹出框')
        .width('60%')
        .onClick(() => {
          // 设置ui上下文环境
          customdialogutil.setuicontext(this.getUIContext())
          // 第一个builder构建函数生成的compoentcontent
          let content: ComponentContent<param> =
            new ComponentContent<param>(this.getUIContext(), wrapBuilder<[param]>(dialogcontent), {
              message: '自定义对话框内容1', updck: () => {
                // 更新对话框的位置
                customdialogutil.update({ alignment: DialogAlignment.Top, offset: { dy: 100, dx: 0 } })
              }, closeck: () => {
                // 关闭对话框
                customdialogutil.close()
              }
            })
          // 设置第一个构建函数的componentcontent
          customdialogutil.setcontent(content)
          customdialogutil.setoption({})
          // 打开对话框
          customdialogutil.open()
        })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}
        customdialogutil.setcontent(content)
          customdialogutil.setoption({})
          // 打开对话框
          customdialogutil.open()
        })

    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}
相关推荐
贾伟康1 天前
【天体运行模拟|03】HarmonyOS ArkTS 场景选择实战:组织行星、卫星与天文现象入口
list·harmonyos·arkts·arkui·页面路由
是稻香啊2 天前
HarmonyOS7 国际化适配:i18n 让你的 App 走向全球
运维·服务器·国际化·arkts·arkui·harmonyos7
m0_749690234 天前
【寻迹校园 HarmonyOS NEXT 实战 37】一套 ArkUI 适配四档宽度:sm、md、lg、xl 响应式 Shell 实战
华为·harmonyos·arkui·navigation·响应式布局·多设备适配
熊猫钓鱼>_>6 天前
鸿蒙ArkUI全手势操作实战指南:6大基础手势从原理到落地避坑
人工智能·深度学习·华为·架构·harmonyos·arkui·tapgesture
贾伟康7 天前
【中国方言题库|11】HarmonyOS ArkTS 学习统计实战:计算地区学习进度与收藏数量
harmonyos·arkts·arkui·数据统计·多设备适配
m0_749690237 天前
【寻迹校园 HarmonyOS NEXT 实战 35】先写全页面 Design Spec 再写 ArkUI:一个比赛项目的设计稿门禁实践
harmonyos·响应式设计·设计规范·arkui·ui设计
Magic-ZYJ7 天前
HarmonyOS 日记类 App 的日期设计:本地自然日、月历与夏令时边界
华为·harmonyos·arkts·arkui·问题排查·移动端开发·独立开发者
贾伟康7 天前
【中国方言题库|12】HarmonyOS ArkTS 题库列表组件实战:减少多地区页面重复并保证点击反馈
harmonyos·arkts·arkui·组件化·多设备适配
贾伟康8 天前
【中国方言题库|09】HarmonyOS ArkTS 方言搜索实战:实现词语检索和无结果反馈
harmonyos·arkts·状态管理·arkui·本地搜索
贾伟康8 天前
【中国方言题库|03】HarmonyOS ArkTS 四川话分库实战:复用题库组件并保持地区参数清晰
harmonyos·arkts·arkui·路由传参·组件复用