鴻蒙(HarmonyOS)實現隱私政策彈窗

安辉發表於2024-08-10

在實現使用者協議彈窗時,通常我們會想到使用系統自定義彈窗,並在彈窗中點選跳轉到Web頁面。但在HarmonyOS中,由於系統彈窗的顯示優先順序高於其他元件,即使跳轉到Web頁面,彈窗依然會顯示在最上層。

為了解決這個問題,我們可以自定義一個元件來模擬彈窗,這樣當跳轉到Web頁面時,Web內容會覆蓋這個模擬的彈窗。

效果圖如下:

首先,我們來看程式的入口程式碼。最外層使用了一個RelativeContainer容器元件,透過showAgreePrivacyPolicy變數控制隱私政策彈窗的顯示狀態。每次啟動應用時,該變數預設設定為true,以顯示隱私政策彈窗。在實際開發中,你可以透過preferences儲存這個變數的狀態。

struct Index {
    @State showAgreePrivacyPolicy:boolean=true;

    build() {
        RelativeContainer(){
            Row({space:10}){
                Image($r('app.media.app_icon')).width(60).height(60)

                Column({space:5}){
                    Text($r('app.string.app_name')).fontSize(22).fontColor($r('app.color.title_color'))
                    Text($r('app.string.launcher_tip')).fontSize(14).fontColor($r('app.color.other_color'))
                }.alignItems(HorizontalAlign.Start)
            }.alignRules({
                bottom: {anchor: "__container__", align: VerticalAlign.Bottom},
                middle: { anchor: '__container__', align: HorizontalAlign.Center }  //以父容器為錨點,水平方向居中對齊
            }).margin({
                bottom:30
            })

            if(this.showAgreePrivacyPolicy){//透過變數控制隱私政策彈窗是否顯示
                PrivacyPolicyDialog({
                    cancel:this.onCancel.bind(this),//取消按鈕點選
                    confirm:this.onAgree.bind(this),//確定按鈕點選
                })
            }
        }.width('100%')
        .height('100%').backgroundColor($r('app.color.white'))
    }

    onCancel():void {
        (getContext(this) as common.UIAbilityContext)?.terminateSelf()
    }

    onAgree():void {//同意隱私政策
        this.showAgreePrivacyPolicy = false;
    }
}

接下來是PrivacyPolicyDialog元件程式碼:

  • 根元件填充100%寬高,設定黑色背景,透明度30%
  • 內容區域使用Stack元件,背景為白色,圓角邊框,寬度佔父元件的80%。
  • 文字內容用Text和Span元件包裹,支援滾動功能。點選使用者協議和隱私政策的文字時,使用router開啟Web頁面。
@Component
export default struct PrivacyPolicyDialog{
    cancel!: () => void
    confirm!: () => void

    build() {
        Stack(){
            Column() {
                Text($r('app.string.simple_user_policy')).fontSize(18).fontColor($r('app.color.title_color')).margin({ top: 30, bottom: 19 })

                Scroll(){
                    Text(){
                        Span($r('app.string.privacy_policy_start'))
                        Span($r('app.string.user_agreement_two')).fontColor($r('app.color.mainColor')).onClick(() => {
                            this.openWebUrl("/useragreement.html");
                        })
                        Span($r('app.string.and'))
                        Span($r('app.string.privacy_policy_two')).fontColor($r('app.color.mainColor')).onClick(() => {
                            this.openWebUrl("/privacypolicy.html");
                        })
                        Span($r('app.string.simple_privacy_policy'))
                    }.fontSize(16).fontColor($r('app.color.body_color')).margin({
                        left:25,
                        right:25
                    })
                }.height(120)

                Column(){
                    Button($r('app.string.disagree_privacy_policy')).onClick(() => {
                        this.cancel();
                    }).fontColor($r('app.color.other_color')).fontSize(15).backgroundColor(Color.Transparent)

                    Button($r('app.string.agree_privacy_policy')).onClick(() => {
                        this.confirm();
                    }).fontColor($r('app.color.white')).fontSize(17)
                        .linearGradient({
                            direction: GradientDirection.Right, colors:[[$r('app.color.start_main_color'),0.0],[$r('app.color.end_main_color'),1.0]]
                        }).width('80%').margin({
                        top:15,bottom:21
                    }).borderRadius(24)
                }
            }.backgroundColor($r('app.color.white')).borderRadius(13).width('80%')
        }.width('100%')
        .height('100%').backgroundColor("#4D000000")//黑色背景 透明度約為 30%
    }

    openWebUrl(urlSuffix:string){
        let url= "https://www.srzs.top"+urlSuffix;
        router.pushUrl({
            url: 'pages/WebViewPage',
            params:{
                data1: 'message',
                url: url  // 傳遞的 URL 引數
            }
        }, router.RouterMode.Single)
    }
}

WebViewPage展示Web網頁的程式碼就不貼出來了,大家可直接下載原始碼。還有載入網頁一定要網路許可權,在entry/module.json5這個檔案中配置。

原始碼下載

https://github.com/ansen666/PrivacyPolicy

如果您想第一時間看我的後期文章,掃碼關注公眾號

      安輝程式設計筆記 - 開發技術分享
             掃描二維碼加關注

相關文章