鸿蒙(HarmonyOS)实现隐私政策弹窗

news/2024/11/16 21:32:04/文章来源:https://www.cnblogs.com/yishaochu/p/18351907

在实现用户协议弹窗时,通常我们会想到使用系统自定义弹窗,并在弹窗中点击跳转到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!: () => voidconfirm!: () => voidbuild() {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

如果您想第一时间看我的后期文章,扫码关注公众号

      安辉编程笔记 - 开发技术分享扫描二维码加关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780686.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试常见术语-几万万人的钉钉、微信软件测试群

3 术语和定义 在本文档中,以下术语和定义适用。 ISO、IEC 和 IEEE 在以下地址维护标准化中使用的术语数据库:ISO 在线浏览平台:https://www.iso.org/obp/ui IEC 电子百科全书:网址:https://www.electropedia.org/ IEEE 在线标准词典:https://ieeexplore.ieee.org/browse/…

dotnet C# 分享基础 for 循环的写法

本文将来和大家聊聊在 dotnet C# 里面的基础的 for 循环语法的写法使用 for 作为循环的写法是在编程里面常用的代码写法。比如说我有一个名为 Foo 的类型,这个类型提供了一个名为 GetCount 的方法,这个方法可以缓慢的获取 Foo 里面的一个代表数量的值。且在 Foo 类型里面提供…

dotnet C# 使用 SHFileOperation 调用 Win32 的文件复制对话框

本文将和大家介绍如何在 dotnet C# 里面使用 SHFileOperation 调用 Windows 自带的文件复制对话框进行文件复制本文核心代码拷贝自 C#中使用SHFileOperation调用Windows的复制文件对话框 - 季风哥 - 博客园 文章,特别感谢大佬提供的方法 实现的效果图如下详细实现逻辑还请大家…

Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标

本文记录 Avalonia 11.1 版本的已知问题,在 Linux 上使用 X11 时,在应用启动时,即使在 Loaded 或 Activated 事件里,都无法使用 PointToScreen 获取到正确的屏幕坐标,只会将传入的点作为返回值此问题已经报告给 Avalonia 官方,请看 https://github.com/AvaloniaUI/Avalon…

乌龟对对碰开局应该抽几只?

结论:30只以上为佳,3的倍数 https://www.bilibili.com/video/BV17nYVekEWU/?vd_source=9b97428fe30142d2bb4f9bab6ef082a4# Import necessary libraries import numpy as np import random from collections import defaultdict import matplotlib.pyplot as plt# Function …

写一个cpp uos系统

#include <iostream>int main() {std::cout << "Hello, UOS!" << std::endl;return 0; }创建一个test.cpp文件, 在当前目录打开终端, 把上面代码内容写里面, 输入g++ test.cpp, 生成了一个a.out文件, ./a.out 输出 Hello, UOS!

C#项目—彩票选号

C#彩票选号软件 今天做了一个彩票选号的小软件,将学到的知识点总结如下; 1.写程序的思路实体类(属性、方法) 主程序调用类方法2.学到的知识点判断、循环 文件的操作(保存、打开) 集合、数组(增加-AddRange、删除-RemoveAt、排序-Reverse) 关键字:Random(随机数-Next)…

C#学习——彩票选号软件

C#彩票选号软件 今天做了一个彩票选号的小软件,将学到的知识点总结如下; 1.写程序的思路实体类(属性、方法) 主程序调用类方法2.学到的知识点判断、循环 文件的操作(保存、打开) 集合、数组(增加-AddRange、删除-RemoveAt、排序-Reverse) 关键字:Random(随机数-Next)…

探究grid_sample函数

一、函数介绍torch.nn.functional.grid_sample(input, grid, mode=bilinear, padding_mode=zeros, align_corners=None)对于4D输入,input维度为 \((N,C,H_{in},W_{in})\), grid维度为 \((N,H_{out},W_{out},2)\) ,则output维度为 \((N,C,H_{out},W_{out})\)对于5D输入,input…

036.CI4框架CodeIgniter,VUE+CI4互通,VUE通过伪静态地址访问,内容为调用的CI4的API

CI4和VUE前端代码,可以看我在https://www.cnblogs.com/tianpan2019写的前2篇运行CI4能正常打开 使用npm run dev 也可以正常打开VUE 根据https://www.cnblogs.com/tianpan2019前1篇把根目录设置成CI4的publi目录 把伪静态内容也写上,内容如下:location / { if (!-e $reques…

2024年1000个计算机毕业设计项目源码(源码+论文【万字】)

【计算机毕设项目】2025级100个热门项目推荐 (前后端Web项目) 以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SpringBoot+Vue框架,MySQL数据库 ①后台免费获…

035.CI4框架CodeIgniter,安装前端VUE并执行

安装node22.5 选择路径 安装完成 装好后使用cmd查看node -v和 npm -v,看一下就知道有没有装好了 nodejs的安装目录,需要完全授权才可以,不然后面会报错 在网站的根目录,打开Powershell 显示权限不足的错误 管理员模式打开系统的Powershell 输入set-ExecutionPolicy RemoteS…