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

来源:https://www.cnblogs.com/yishaochu/p/18351907
-Advertisement-
Play Games

在實現用戶協議彈窗時,通常我們會想到使用系統自定義彈窗,併在彈窗中點擊跳轉到Web頁面。但在HarmonyOS中,由於系統彈窗的顯示優先順序高於其他組件,即使跳轉到Web頁面,彈窗依然會顯示在最上層。 為瞭解決這個問題,我們可以自定義一個組件來模擬彈窗,這樣當跳轉到Web頁面時,Web內容會覆蓋這個模 ...


在實現用戶協議彈窗時,通常我們會想到使用系統自定義彈窗,併在彈窗中點擊跳轉到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

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

      安輝編程筆記 - 開發技術分享
             掃描二維碼加關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、背景 大數據服務是數據平臺建設的基座,隨著B站業務的快速發展,其大數據的規模和複雜度也突飛猛進,技術的追求也同樣不會有止境。 B站一站式大數據集群管理平臺(BMR),在千呼萬喚中孕育而生。本文簡單介紹BMR的由來、面臨的主要矛盾以及如何在變化中求得生存與發展。 下圖是截至2024年6月初,統計到 ...
  • 摘要:現在商用優化器大多都是基於統計信息進行查詢代價評估,因此統計信息是否實時且準確對查詢影響很大,特別是分散式資料庫場景。本文詳細介紹GaussDB(DWS)如何實現了一種輕量、實時、準確的統計信息自動收集方案。 本文分享自華為雲社區《【最佳實踐】GaussDB(DWS) 統計信息自動收集方案》, ...
  • 在大數據時代,企業對數據的依賴程度越來越高。然而,隨著業務的不斷發展和技術的快速迭代,大數據平臺的集群遷移已成為企業數據中台發展途中無法迴避的需求。在大數據平臺發展初期,國內數據中台市場主要以國外開源 CDH、商業化 CDP、HDP 為主。然而,由於國際形勢的轉變,以海外大數據基礎平臺作為基石構建的 ...
  • MySQL UDF 提權初探 對 MySQL UDF 提權做一次探究,什麼情況下可以提權,提取的主機許可權是否跟mysqld進程啟動的主機賬號有關 資料庫信息 MySQL資料庫版本:5.7.21 UDF UDF:(User Defined Function) 用戶自定義函數,MySQL資料庫的初衷是用 ...
  • 資料庫基礎知識 為什麼要使用資料庫? 數據保存在記憶體 優點:存取速度快 缺點:數據不能永久保存 數據保存在文件 優點:數據永久保存 缺點: 速度比記憶體操作慢,頻繁的IO操作。 查詢數據不方便 數據保存在資料庫 數據永久保存 使用SQL語句,查詢方便效率高。 管理數據方便 什麼是SQL? 結構化查詢語 ...
  • 事務複製中訂閱節點非活動( inactive)錯誤 在SQLServer的事務複製模型中,會出現“訂閱過期”的錯誤,相關訂閱分發代理Job的典型錯誤如下:"Agent SQLNYC01-Onvoices-PubInvoicesInvoices-SQLNYC01-1353 is retrying af ...
  • 《數據資產管理核心技術與應用》是清華大學出版社出版的一本圖書,全書共分10章,第1章主要讓讀者認識數據資產,瞭解數據資產相關的基礎概念,以及數據資產的發展情況。第2~8章主要介紹大數據時代數據資產管理所涉及的核心技術,內容包括元數據的採集與存儲、數據血緣、數據質量、數據監控與告警、數據服務、數據許可權 ...
  • 在當今數字化的時代,企業對於數據的管理和利用愈發重視,而構建全面的指標管理體系成為了企業提升數據價值、優化決策流程的關鍵環節。 構建完整的指標屬性體系 指標屬性體系是指標管理的核心,我們一般將指標屬性劃分為四類:基礎屬性、業務屬性、技術屬性和管理屬性。 基礎屬性:如指標名稱、編碼等。 業務屬性:如業 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...