HarmonyOS:弹出框层级管理

一、简介

ArkUI的弹出框节点都是直接挂载在根节点上,会根据层级从小到大依次挂载。根节点下,右边的弹出框节点会覆盖显示在左边的弹出框节点上,新创建的弹出框节点会根据层级大小插入到对应的位置,同一层级大小的弹窗节点按照创建的先后顺序进行挂载。

从API version 18开始,可以通过设置levelOrder参数来管理弹出框的显示顺序,确保层级较高的弹出框覆盖在层级较低的弹出框之上,从而根据需要灵活控制各层弹出框的显示效果。

二、使用约束

目前openCustomDialog、CustomDialog、AlertDialog、ActionSheet、showDialog支持通过levelOrder参数来管理弹出框的层次。
说明 弹出框层级管理不支持子窗场景,即当showInSubWindow设置为true时,levelOrder参数设置无效。不支持动态刷新弹出框的显示顺序。

三、创建不同层级的弹出框

说明 详细变量定义请参考下面完整示例。

  1. 初始化一个弹出框内容区,内部包含一个Text组件。
bash 复制代码
@Builder normalCustomDialog(index: number) {
  Column() {
    Text("我是普通弹窗" + index).fontSize(30)
  }.height(400).padding(5).justifyContent(FlexAlign.SpaceBetween)
}
  1. 初始化另一个弹出框内容区,内部包含一个点击打开普通弹出框的按钮,点击事件中通过调用UIContext中getPromptAction方法获取PromptAction对象,再通过该对象调用openCustomDialog接口,并且设置层级为0的levelOrder参数来创建普通层级弹出框。
bash 复制代码
@Builder topCustomDialog() {
  Column() {
    Text("我是置顶弹窗").fontSize(30)
    Row({ space: 50 }) {
      Button('点我打开普通弹窗')
        .onClick(() => {
          this.getUIContext().getPromptAction().openCustomDialog({
            builder: () => {
              this.normalCustomDialog(this.dialogIndex)
            },
            levelOrder: LevelOrder.clamp(0),
          })
            .catch((err: BusinessError) => {
              console.error("openCustomDialog error: " + err.code + " " + err.message)
            })
          this.dialogIndex++
        })
    }
  }.height(200).padding(5).justifyContent(FlexAlign.SpaceBetween)
}
  1. 通过调用UIContext中getPromptAction方法获取PromptAction对象,再通过该对象调用openCustomDialog接口,并且设置层级为100000的levelOrder参数来创建最高层级弹出框。
bash 复制代码
this.getUIContext().getPromptAction().openCustomDialog({
  builder: () => {
    this.topCustomDialog()
  },
  levelOrder: LevelOrder.clamp(100000)
}).catch((err: BusinessError) => {
  console.error("openCustomDialog error: " + err.code + " " + err.message)
})

效果图

示例完整代码

bash 复制代码
import { LevelOrder } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct TestOpenCustomDialog4 {
  @StorageLink('dialogIndex') dialogIndex: number = 0

  @Builder normalCustomDialog(index: number) {
    Column() {
      Text("我是普通弹窗" + index).fontSize(30)
    }.height(400).padding(5).justifyContent(FlexAlign.SpaceBetween)
  }

  @Builder topCustomDialog() {
    Column() {
      Text("我是置顶弹窗").fontSize(30)
      Row({ space: 50 }) {
        Button('点我打开普通弹窗')
          .onClick(() => {
            this.getUIContext().getPromptAction().openCustomDialog({
              builder: () => {
                this.normalCustomDialog(this.dialogIndex)
              },
              levelOrder: LevelOrder.clamp(0),
            })
              .catch((err: BusinessError) => {
                console.error("openCustomDialog error: " + err.code + " " + err.message)
              })
            this.dialogIndex++
          })
      }
    }.height(200).padding(5).justifyContent(FlexAlign.SpaceBetween)
  }

  build() {
    Column() {
      Button('点击弹窗')
        .fontSize(20)
        .onClick(() => {
          this.getUIContext().getPromptAction().openCustomDialog({
            builder: () => {
              this.topCustomDialog()
            },
            levelOrder: LevelOrder.clamp(100000)
          }).catch((err: BusinessError) => {
            console.error("openCustomDialog error: " + err.code + " " + err.message)
          })
        })
    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
懿路向前1 小时前
HarmonyOS 粒子特效实战:马赛克切块提速 17.6×~38×:desiredRegion 重复读盘与一次解码管线(HarmonyOS)
华为·harmonyos
天府云创3 小时前
Agentic开发时代到来——鸿蒙PC三大原生开发工具公测
华为·操作系统·harmonyos·鸿蒙系统·cli·deveco·agentic
程序猿追3 小时前
Fleks 鸿蒙适配:从八个小球看实体和组件的变化
华为·harmonyos
Sunny_GMF3 小时前
Markdown 导出 HTML 实战:2.6MB 编辑器快照如何瘦身 71%(DOM 净化 + CSSOM 运行时裁剪)
编辑器·html·ai编程·harmonyos
m0_738185823 小时前
Flutter 鸿蒙化实战:the_apple_sign_in 适配 OpenHarmony,Apple 登录
flutter·华为·harmonyos·鸿蒙
神奇的代码在哪里4 小时前
原生鸿蒙 GBC 模拟器开发实录:用 Anime4K 把 160×144 画面实时放大到 1080P
harmonyos·鸿蒙·超分辨率·gbc模拟器·anime4k
m0_738185824 小时前
Flutter 鸿蒙化实战:umeng_analytics_plugin 适配 OpenHarmony,友盟统计
flutter·华为·harmonyos·鸿蒙
todoitbo4 小时前
把 XAMPP 搬到鸿蒙 PC:在鸿蒙 PC 上跑 Apache httpd 2.4.69实战项目
华为·apache·harmonyos·鸿蒙·开源鸿蒙·鸿蒙pc
JoyCong19984 小时前
即插即用,组合键可用:ToDesk 4820版本强化鸿蒙远控键鼠能力
华为·智能手机·harmonyos·远程工作·ipad
程序猿追4 小时前
漏字、换词序、空查询:用 FuzzyKot 做一次鸿蒙搜索交互排查
华为·交互·harmonyos