HarmonyOS 自定义弹窗 (CustomDialog)问题

privilegesDialog: CustomDialogController = new CustomDialogController({  
    builder: PrivicyPrivilegesDialog({  
      privacyUrl: this.privacyUrl,  
      serviceUrl: this.serviceUrl,  
      clickPrivacy: () => {  
        this.clickPrivacy()  
      },  
      cancel: () => {  
        this.dialogCancel()  
      },  
      sure: () => {  
        PreferencesUtil.putSyncBooblean(PreferencesKey.isAgreePrivacy,true)  
        this.dialogSure()  
      },  
    }),  
    cancel: this.dialogCancel,  
    autoCancel: false,  
    alignment: DialogAlignment.Center,  
    offset: { dx: 0, dy: -20 },  
    gridCount: 3.8,  
    customStyle: true,  
    onWillDismiss:(dismissDialogAction: DismissDialogAction)=> {  
      console.info("reason=" + JSON.stringify(dismissDialogAction.reason))  
      console.log("dialog onWillDismiss")  
      if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {  
        //监听返回事件,不关闭  
      }  
      if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {  
        //监听点击屏幕,不关闭  
      }  
    }  
  })

隐私弹窗配置如上,当点击内容里的链接跳转新的页面 弹窗一直展示在栈顶位置,不能被新页面覆盖吗?

HarmonyOS
2024-10-18 10:16:36
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

实现当前场景目前有两个思路。

1.通过stack和自定义组件模拟一个弹窗,并通过visibility控制弹窗的显示和消失。

import router from '@ohos.router';  
@Entry  
@Component  
struct First {  
  // 显隐控制设置为不占用  
  @State visible: Visibility = Visibility.None  
  build() {  
    // 使用stack可以实现假的dialog覆盖原页面上面  
    Stack() {  
      Row() {  
        // 初始页面  
        Column() {  
          // 触发dialog的地方  
          Button('click').onClick(() => {  
            //用于检测点击事件是否透传到原来的页面,是符合dialog规范  
            console.log("hit me!")  
            if (this.visible == Visibility.Visible) {  
              this.visible = Visibility.None  
            } else {  
              this.visible = Visibility.Visible  
            }  
          }).fontColor(0x000000)  
        }.width('100%')  
      }.height('100%')  
      Column() {  
        // 这个可以调节对话框效果,栅格布局,xs,sm,md,lg分别为四种规格  
        // 下面的breakpoints是用来区别当前属于哪个类型的断点。gridRow里的栅格数量为总数,gridCol里的就是偏移和假Dialog所占据的栅格数  
        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}  
          }) {  
            // 这里放的就是原Dialog里的column里的东西,稍微改改应该就可以用了  
            Column() {  
              Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })  
              Flex({ justifyContent: FlexAlign.SpaceAround }) {  
                Button('cancel').onClick(() => {  
                  if (this.visible == Visibility.Visible) {  
                    this.visible = Visibility.None  
                  } else {  
                    this.visible = Visibility.Visible  
                  }  
                }).backgroundColor(0xffffff).fontColor(Color.Black)  
                Button('jump').onClick(() => {  
                  router.pushUrl({ url: 'pages/Page1' })  
                }).backgroundColor(Color.Black).fontColor(Color.Red)  
              }.margin({ bottom: 10 })  
            }.backgroundColor(Color.Grey).visibility(this.visible).clip(true).borderRadius(20)  
          }  
        }  
      }.width('95%') //设置弹窗宽度  
    }  
  }  
}

2.使用NavDestination的Dialog模式实现自定义弹窗。

@Component  
export struct PrivacyDialog {  
  @Consume('pageInfo') pageStack : NavPathStack;  
  @State isAgree: string = "Not Agree";  
  build() {  
    NavDestination(){  
      Stack({ alignContent: Alignment.Center }){  
        // 蒙层  
        Column() {  
        }  
        .width("100%")  
        .height("100%")  
        .backgroundColor('rgba(0,0,0,0.5)')  
        // 隐私弹窗  
        Column() {  
          Text("注册应用账号").fontSize(30).height('20%')  
          Text("请您仔细阅读一下协议并同意,我们将全力保护您的个人信息安全,您可以使用账号登录APP。").height('40%')  
          Divider()  
          Row(){  
            // 点击隐私条款,跳转到隐私条款页面,并接受隐私条款的返回值,用来刷新页面的同意状态。  
            Text("《应用隐私政策》").onClick(ent => {  
              let pathInfo : NavPathInfo = new NavPathInfo('PrivacyItem', null  
                , (popInfo: PopInfo) => {  
                  this.isAgree = popInfo.result.toString();  
                })  
              this.pageStack.pushDestination(pathInfo, true)  
            })  
            Text(this.isAgree)  
          }.height('20%')  
          Divider()  
          // 点击同意不同意按钮,将状态返回登录页  
          Row(){  
            Button("不同意").onClick(ent => {  
              this.pageStack.pop("Not Agree", true)  
            }).width('30%')  
            Button("同意").onClick(ent => {  
              this.pageStack.pop("Agree", true)  
            }).width('30%')  
          }.height('20%')  
        }.backgroundColor(Color.White)  
        .height('50%')  
        .width('80%')  
      }  
    }.hideTitleBar(true)  
    // 设置Dialog类型  
    .mode(NavDestinationMode.DIALOG)  
  }  
}
分享
微博
QQ
微信
回复
2024-10-18 17:52:29
相关问题
HarmonyOS 自定义弹窗CustomDialog问题
616浏览 • 1回复 待解决
HarmonyOS 自定义弹窗问题
706浏览 • 1回复 待解决
CustomDialog自定义动画
419浏览 • 1回复 待解决
HarmonyOS 自定义弹窗刷新问题
50浏览 • 1回复 待解决
自定义弹窗使用相关问题
929浏览 • 1回复 待解决
HarmonyOSCustomDialog自定义Dialog
272浏览 • 1回复 待解决
HarmonyOS 自定义弹窗部分问题答疑
321浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1154浏览 • 1回复 待解决
HarmonyOS 自定义弹窗选择
374浏览 • 1回复 待解决