鸿蒙开发中如何控制CustomDialog显示层级 ?

鸿蒙开发中如何控制CustomDialog显示层级 ?

阅读 1.2k
avatarAI BotBETA

在鸿蒙(HarmonyOS)开发中,控制CustomDialog的显示层级通常涉及到调整Dialog的显示模式或管理其在视图层级中的位置。由于HarmonyOS的UI框架和API可能与Android有所不同,这里提供一种通用的思路和可能的方法来实现或调整CustomDialog的显示层级:

1. 使用AlignmentMargin调整位置

虽然直接调整“层级”的概念可能不像在Web或某些桌面应用中那样直接,但你可以通过控制Dialog的显示位置和大小来影响它在屏幕上的视觉“层级”。使用布局参数(如AlignmentMargin)来调整Dialog在其父视图或屏幕上的位置。

2. 设置Dialog的显示类型

检查CustomDialog的创建和显示API,看是否有参数可以指定Dialog的显示类型(如模态、非模态等),以及是否有方法可以控制它是否浮动在顶层。

3. 自定义Dialog的容器

如果标准的CustomDialog无法满足你的需求,你可以考虑完全自定义一个Dialog,通过继承一个合适的类(如ComponentComponentContainer),并在其中添加你需要的UI元素。这样,你就可以更精确地控制这些元素的层级和显示方式。

4. 使用布局和组件的Z轴

在某些情况下,你可能能够使用布局或组件的Z轴属性(如果HarmonyOS支持的话)来控制显示层级。这通常涉及到设置组件的绘制顺序或深度。

5. 查阅官方文档和社区

由于HarmonyOS是一个相对较新的平台,它的API和最佳实践可能仍在不断发展和变化。因此,强烈建议查阅最新的官方文档和社区论坛,看看是否有关于如何控制Dialog显示层级的更具体指导或最佳实践。

结论

由于HarmonyOS的API和框架细节可能与其他平台有所不同,上述建议应作为一般性的指导。具体实现时,你需要根据HarmonyOS的文档和API进行调整。如果HarmonyOS的CustomDialog或相关类提供了直接控制层级的属性或方法,那么使用这些将是最直接和有效的方法。

1 个回答

router跳转:

import router from '@ohos.router'; 
 
@CustomDialog 
export default struct UserPrivacyDialog { 
  controller: CustomDialogController = new CustomDialogController({ builder: '' }); 
  cancel: Function = () => { 
  }; 
  confirm: Function = () => { 
  }; 
  visible: Visibility = Visibility.None 
 
  build() { 
    Column() { 
      Button('jump') 
        .onClick(() => { 
          router.pushUrl({ 
            url: 'pages/PageTwo' 
          }) 
        }).backgroundColor(0xffffff).fontColor(Color.Red) 
    } 
    .margin({ top: 22 }) 
    .justifyContent(FlexAlign.SpaceEvenly) 
  } 
} 
 
@Entry 
@Component 
struct Index { 
  @State textValue: string = 'Hello World' 
  @State visible: Visibility = Visibility.None 
 
  build() { 
    Stack() { 
      Row() { 
        Column() { 
          Button('click') 
            .onClick(() => { 
              if (this.visible == Visibility.Visible) { 
                this.visible = Visibility.None 
              } else { 
                this.visible = Visibility.Visible 
              } 
            }) 
            .backgroundColor(0x777474) 
            .fontColor(0x000000) 
        } 
        .width('100%') 
      } 
      .height('100%') 
      .backgroundColor(0x885555) 
 
      Text('') 
        .onClick(() => { 
          if (this.visible == Visibility.Visible) { 
            this.visible = Visibility.None 
          } else { 
            this.visible = Visibility.Visible 
          } 
        }) 
        .width('100%') 
        .height('100%')// 透明度可以自己调节一下 
        .opacity(0.16) 
        .backgroundColor(0x000000) 
        .visibility(this.visible) 
 
      Column() { 
        GridRow({ 
          columns: { 
            xs: 1, 
            sm: 4, 
            md: 8, 
            lg: 12 
          }, 
          breakpoints: { 
            value: ["400vp", "600vp", "800vp"], 
            reference: BreakpointsReference.WindowSize 
          }, 
        }) { 
          GridCol({ 
            span: { 
              xs: 1, 
              sm: 2, 
              md: 4, 
              lg: 8 
            }, 
            offset: { 
              xs: 0, 
              sm: 1, 
              md: 2, 
              lg: 2 
            } 
          }) { 
            Column() { 
              Flex({ justifyContent: FlexAlign.SpaceAround }) { 
                UserPrivacyDialog(); 
              }.margin({ bottom: 10 }) 
            } 
            .backgroundColor(0xffffff) 
            .visibility(this.visible) 
            .clip(true) 
            .borderRadius(20) 
          } 
        } 
      }.width('95%') //设置弹窗宽度 
    } 
  } 
}

navigation方式跳转:

import promptAction from '@ohos.promptAction'; 
 
@Component 
export struct Test1 { 
  @State message: string = 'Hello World'; 
 
  build() { 
    NavDestination() { 
      Row() { 
        Column() { 
          Text(this.message) 
            .fontSize(50) 
            .fontWeight(FontWeight.Bold) 
        } 
        .width('100%') 
      } 
      .height('100%') 
    }.onBackPressed(() => { 
      promptAction.showToast({ message: '123' }) 
      return false 
    }) 
  } 
} 
 
@Entry 
@Component 
struct Index { 
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack() 
  @State textValue: string = '输入' 
  // 显隐控制设置为不占用 
  @State visible: Visibility = Visibility.None 
 
  @Builder 
  PageMap(name: string) { 
    if (name === 'pageOne') { 
      Test1() 
    } 
  } 
 
  build() { 
    Navigation(this.pageInfos) { 
      Column() { 
        Stack() { 
          Row() { 
            Column() { 
              Text('我是第一个页面') 
                .fontSize(30) 
                .fontWeight(FontWeight.Bold) 
              Button('按钮') 
                .onClick(() => { 
                  console.log("hit me!") 
                  if (this.visible == Visibility.Visible) { 
                    this.visible = Visibility.None 
                  } else { 
                    this.visible = Visibility.Visible 
                  } 
                }) 
                .backgroundColor(0x777474) 
                .fontColor(0x000000) 
            } 
            .height('100%') 
            .width('100%') 
            .justifyContent(FlexAlign.Start) 
            .alignItems(HorizontalAlign.Center) 
          } 
          .height('100%') 
          .backgroundColor('#FFF') 
 
          Text('') 
            .onClick(() => { 
              if (this.visible == Visibility.Visible) { 
                this.visible = Visibility.None 
              } else { 
                this.visible = Visibility.Visible 
              } 
            }) 
            .width('100%') 
            .height('100%')// 透明度可以自己调节一下 
            .opacity(0.5) 
            .backgroundColor(Color.Black) 
            .visibility(this.visible) 
          Column() { 
            GridRow({ 
              columns: { 
                xs: 1, 
                sm: 4, 
                md: 8, 
                lg: 12 
              }, 
              breakpoints: { 
                value: ["400vp", "600vp", "800vp"], 
                reference: BreakpointsReference.WindowSize 
              }, 
            }) { 
              GridCol({ 
                span: { 
                  xs: 1, 
                  sm: 2, 
                  md: 4, 
                  lg: 8 
                }, 
                offset: { 
                  xs: 0, 
                  sm: 1, 
                  md: 2, 
                  lg: 2 
                } 
              }) { 
                Column() { 
                  Text('安全隐私').fontSize(20).margin({ top: 10, bottom: 10 }) 
                  Text('是否跳转到隐私详情页面?').fontSize(16).margin({ bottom: 10 }) 
                  Flex({ justifyContent: FlexAlign.SpaceAround }) { 
                    Button('取消') 
                      .onClick(() => { 
                        if (this.visible == Visibility.Visible) { 
                          this.visible = Visibility.None 
                        } else { 
                          this.visible = Visibility.Visible 
                        } 
 
                      }).backgroundColor(0xffffff).fontColor(Color.Black) 
                    Button('确定') 
                      .onClick(() => { 
                        this.pageInfos.pushPath({ name: 'pageOne' }) 
                      }).backgroundColor(0xffffff).fontColor(Color.Red) 
                  }.margin({ bottom: 10 }) 
                } 
                .backgroundColor(0xffffff) 
                .visibility(this.visible) 
                .clip(true) 
                .borderRadius(20) 
              } 
            } 
          }.width('100%') //设置弹窗宽度 
        } 
      }.width('100%').margin({ top: 5 }) 
    }.navDestination(this.PageMap) 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题