1# 弹出框层级管理 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @houguobiao--> 5<!--Designer: @houguobiao--> 6<!--Tester: @lxl007--> 7<!--Adviser: @HelloCrease--> 8ArkUI的弹出框节点都是直接挂载在根节点上,会根据层级从小到大依次挂载。根节点下,右边的弹出框节点会覆盖显示在左边的弹出框节点上,新创建的弹出框节点会根据层级大小插入到对应的位置,同一层级大小的弹窗节点按照创建的先后顺序进行挂载。 9 10从API version 18开始,可以通过设置[levelOrder](../reference/apis-arkui/js-apis-promptAction.md#basedialogoptions11)参数来管理弹出框的显示顺序,确保层级较高的弹出框覆盖在层级较低的弹出框之上,从而根据需要灵活控制各层弹出框的显示效果。 11 12## 使用约束 13 14目前[openCustomDialog](arkts-uicontext-custom-dialog.md)、[CustomDialog](arkts-common-components-custom-dialog.md)、[AlertDialog](arkts-fixes-style-dialog.md#警告弹窗-alertdialog)、[ActionSheet](arkts-fixes-style-dialog.md#列表选择弹窗-actionsheet)、[showDialog](arkts-fixes-style-dialog.md#对话框-showdialog)支持通过levelOrder参数来管理弹出框的层次。 15 16> **说明:** 17> 18> 弹出框层级管理不支持子窗场景,即当showInSubWindow设置为true时,levelOrder参数设置无效。不支持动态刷新弹出框的显示顺序。 19 20## 创建不同层级的弹出框 21 22> **说明:** 23> 24> 详细变量定义请参考[完整示例](#完整示例)。 25 261.初始化一个弹出框内容区,内部包含一个Text组件。 27 28```ts 29@Builder normalCustomDialog(index: number) { 30 Column() { 31 Text("我是普通弹窗" + index).fontSize(30) 32 }.height(400).padding(5).justifyContent(FlexAlign.SpaceBetween) 33} 34``` 35 362.初始化另一个弹出框内容区,内部包含一个点击打开普通弹出框的按钮,点击事件中通过调用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中[getPromptAction](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getpromptaction)方法获取[PromptAction](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md)对象,再通过该对象调用[openCustomDialog](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#opencustomdialog12)接口,并且设置层级为0的[levelOrder](../reference/apis-arkui/js-apis-promptAction.md#basedialogoptions11)参数来创建普通层级弹出框。 37 38```ts 39@Builder topCustomDialog() { 40 Column() { 41 Text("我是置顶弹窗").fontSize(30) 42 Row({ space: 50 }) { 43 Button('点我打开普通弹窗') 44 .onClick(() => { 45 this.getUIContext().getPromptAction().openCustomDialog({ 46 builder: () => { 47 this.normalCustomDialog(this.dialogIndex) 48 }, 49 levelOrder: LevelOrder.clamp(0), 50 }) 51 .catch((err: BusinessError) => { 52 console.error("openCustomDialog error: " + err.code + " " + err.message) 53 }) 54 this.dialogIndex++ 55 }) 56 } 57 }.height(200).padding(5).justifyContent(FlexAlign.SpaceBetween) 58} 59``` 60 613.通过调用[UIContext](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md)中[getPromptAction](../reference/apis-arkui/arkts-apis-uicontext-uicontext.md#getpromptaction)方法获取[PromptAction](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md)对象,再通过该对象调用[openCustomDialog](../reference/apis-arkui/arkts-apis-uicontext-promptaction.md#opencustomdialog12)接口,并且设置层级为100000的[levelOrder](../reference/apis-arkui/js-apis-promptAction.md#basedialogoptions11)参数来创建最高层级弹出框。 62 63```ts 64this.getUIContext().getPromptAction().openCustomDialog({ 65 builder: () => { 66 this.topCustomDialog() 67 }, 68 levelOrder: LevelOrder.clamp(100000) 69}).catch((err: BusinessError) => { 70 console.error("openCustomDialog error: " + err.code + " " + err.message) 71}) 72``` 73 74## 完整示例 75```ts 76import { LevelOrder } from '@kit.ArkUI'; 77import { BusinessError } from '@kit.BasicServicesKit'; 78 79@Entry 80@Component 81struct Index { 82 @StorageLink('dialogIndex') dialogIndex: number = 0 83 84 @Builder normalCustomDialog(index: number) { 85 Column() { 86 Text("我是普通弹窗" + index).fontSize(30) 87 }.height(400).padding(5).justifyContent(FlexAlign.SpaceBetween) 88 } 89 90 @Builder topCustomDialog() { 91 Column() { 92 Text("我是置顶弹窗").fontSize(30) 93 Row({ space: 50 }) { 94 Button('点我打开普通弹窗') 95 .onClick(() => { 96 this.getUIContext().getPromptAction().openCustomDialog({ 97 builder: () => { 98 this.normalCustomDialog(this.dialogIndex) 99 }, 100 levelOrder: LevelOrder.clamp(0), 101 }) 102 .catch((err: BusinessError) => { 103 console.error("openCustomDialog error: " + err.code + " " + err.message) 104 }) 105 this.dialogIndex++ 106 }) 107 } 108 }.height(200).padding(5).justifyContent(FlexAlign.SpaceBetween) 109 } 110 111 build() { 112 Row() { 113 Column({ space: 5 }) { 114 Button('点击弹窗') 115 .fontSize(20) 116 .onClick(() => { 117 this.getUIContext().getPromptAction().openCustomDialog({ 118 builder: () => { 119 this.topCustomDialog() 120 }, 121 levelOrder: LevelOrder.clamp(100000) 122 }).catch((err: BusinessError) => { 123 console.error("openCustomDialog error: " + err.code + " " + err.message) 124 }) 125 }) 126 }.width('100%') 127 } 128 } 129} 130``` 131 132