HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

news2024/11/16 17:31:47

关键词:CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常

问题存在API版本:API10 - API12(该问题已反馈,期望后续官方能增加页面级控制能力)

在正常的鸿蒙app开发过程中,时常会加载一些弹窗内容,比如隐私政策弹窗、新手引导弹窗、营销广告弹窗等。那么我们会选择使用 CuntomDialog 或创建 SubWindow 的形式去展示出我们的弹窗,但是目前鸿蒙的弹窗存在 2 个问题

①弹窗无法保持在目标页面的问题:鸿蒙中自定义弹窗或子窗口由于展示优先级高于其他组件,则会出现当弹窗正在展示时跳转进入下一个页面后,弹窗依旧展示在 app 最上层的异常情况,或当折叠屏设备分屏后展示出弹窗,合起折叠屏后,弹窗同样会展示在下一个页面上的异常情况。

②无法控制弹窗展示优先级的问题:如当前存在 2 个弹窗,先展示弹窗 B,后展示弹窗 A,同时要求弹窗 A 展示在弹窗 B 上层,当前的鸿蒙弹窗并不支持这样的操作,仅为谁后来谁在上的原则。

 解决前    解决后

那么我们应该如何解决这 2 种情况?想要解决该问题,那我们就不能再去使用这两种弹窗方式。要想弹窗仅展示在我们的目标页面中,那么我们就应该使用 Stack 层叠布局的形式去改造我们的页面整体结构,从页面左上角 0vp 处摆放一个宽高均为 0vp 的组件当作我们的弹窗展示容器,将所有的弹窗都统一管理在该组件中,用状态变量实现控制显隐弹窗的操作,明确目标那么开始。

本期文章完整demo以上传至Gitee:Harmony 自定义弹窗页面级控制解决方案

1. Stack 布局改造页面结构

将以往弹窗逻辑由图1 调整至图2 ,第 2 步开始将介绍 DialogView 自定义组件的用法。

图1(改造前)

图2(改造后)

2. DialogView 自定义组件的实现

经过第 1 步的改造后,我们已经在页面左上角提前占位了弹窗展示区域,在该 DialogView 自定义组件中,统一管理我们的弹窗组件,这样我们也就可以自行编排布局控制弹窗的展示层级与先后顺序了。

可以使用 Column 组件直接控制弹窗展示顺序(当2个及以上的弹窗同时展示时,其他组件会在屏幕外等待展示,上一个弹窗隐藏后,下一个弹窗展示)
或使用 Stack 组件直接控制弹窗展示层级(当2个及以上的弹窗同时展示时,各弹窗同时展示在页面上,可自行摆放弹窗的上下层级关系)

这里我们就按照两个弹窗都展示在屏幕内的业务,使用 Stack 布局。

3. DialogViewController 控制器的实现

在前2步中已经初步实现了弹窗的页面级与层级的控制,那么如何做到弹窗动态的展示或隐藏操作?

首先我们需要了解,鸿蒙应用开发过程中,要想改变 UI 展示效果,需要配合使用一系列的状态装饰器,使属性成为状态变量,当被状态装饰器装饰的属性发生变化后,在页面UI中使用到该属性的地方,都会触发UI更新,如最直观的就是 @State 装饰器。

就目前场景而言,弹窗与主页面之间已经出现跨组件的情况了,实际开发过程中业务场景会更为复杂,所以我们可以直接使用 class 类配合 @Observed 装饰器实现跨组件之间的数据通讯,只需在父组件创建出目标对象,传递至弹窗组件,并用 @ObjectLink 绑定接收即可,这样做的好处是,不管途中经过多少组件,弹窗组件调用该对象方法,也能改变途中使用到该对象方法的UI,并且能够更好的统一管理所有的弹窗状态(或直接使用单例形式导出,在目标弹窗组件直接使用 @State 装饰器接收该单例对象即可,无需在根页面 new 出控制器对象进行逐级传递)。

如下图所示,DialogViewController 仅为 2 个弹窗展示状态的属性,并进行私有,使用对外提供的各种方法获取或改变二者属性的值。

更多装饰器相关使用请参考官方文档,此处就不过多赘述:harmonyOS文档中心 - 状态管理

4. 弹窗内布局如何编排

我们从步骤 1 开始改造布局到步骤 2 的自定义弹窗组件实现,都并未看到对弹窗进行宽度高度的设置,那我们的弹窗应该如何铺满屏幕?以 PrivacyDialog 为例,我们只需要在需要展示的弹窗上设置对应的宽度及高度即可,当弹窗不展示,则在第 2 步中 DialogView 的宽高为 0,该方式可避免在没有弹窗时的情况下,弹窗组件影响主页面触摸点击事件的影响。

5. 完整demo

本期文章完整demo已提交至Gitee,可回顶部查看。

6. end

此处打个广告介绍下我开发的 markdown 预览解析三方库,@luvi/lv-markdown-in

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】命令管道

一、命名管道的介绍 之前的管道博客中介绍的是匿名管道,这个管道的应用的一个限制就是只能在具有公共祖先(具有亲缘关系)的进程间通信。 如果我们不想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,他经常…

Arduino UNO R3自学笔记6 之 Arduino引脚(IO)功能介绍

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:Ardunio UNO R3有很多引脚,接下来主要介绍它们都可以用做什么。 从上图不难看出开发板引脚也不是有多少,分类来看也就以下种类型&…

C语言、Eazy_X——五子棋

//五子棋#include<graphics.h>#define board_size 20 #define pixel 600 int pr pixel / board_size; char board_data[board_size][board_size]; char current_piece o; int count 0;//检测指定玩家是否获胜 bool CheckWin(char c) {int i, j;//检查行for (i 0; i &…

位运算(6)_只出现一次的数字 II

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(6)_只出现一次的数字 II 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

自动驾驶系列—解析自动驾驶汽车的“大脑”:电子电气架构详解与选型指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【折半查找】

目录 一. 折半查找的概念二. 折半查找的过程三. 折半查找的代码实现四. 折半查找的性能分析 \quad 一. 折半查找的概念 \quad 必须有序 \quad 二. 折半查找的过程 \quad \quad 三. 折半查找的代码实现 \quad 背下来 \quad 四. 折半查找的性能分析 \quad 记住 比较的是层数 …

python如何显示数组

np.set_printoptions方法的相关属性&#xff1a; <span style"background-color:#272822"><span style"color:#f8f8d4">set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, suppressNone, nanstrNone, infstrNo…

【论文精度——长尾问题】Long-Tailed Learning as Multi-Objective Optimization

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. Abstract …

Python数据分析篇--NumPy--进阶

人有一种天生的、难以遏制的欲望&#xff0c;那就是在理解之前就评判。 -- 米兰昆德拉 多维数组 1. 一维数组只有行&#xff0c;二维数组相比一维数组多了列这个维度&#xff0c;而三维数组则类似多个二维数组堆叠在一起&#xff0c;形如一个立方体。 二维数组的创建 1. 二…

Java中的顺序控制、分支控制、嵌套分支if-else

if-else 顺序控制分支控制if-else单分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图 双分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图5.练习 多分支1.基本语法2.说明&#xff1a;3.流程图4.练习 嵌套分支1.基本介绍2.基本语法3.练习 顺序控制 1.介绍&#xff1a;程…

CMake所学

向大佬lyf学习&#xff0c;先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1.1 最外层CMakeLists1.1.1 cmake_minimum_required&#xff08;&#xff09;1.1.2 project&#xff08;&#xff09;1.1.3 set&#xff08;&#xff09;1.1.4 add_subdirectory&#xf…

小红书制作视频如何去原视频音乐,视频如何去原声保留背景音乐?

在视频编辑、音乐制作或个人娱乐中&#xff0c;有时我们希望去掉视频中的原声&#xff08;如对话、解说等&#xff09;&#xff0c;仅保留背景音乐。这种处理能让观众更加聚焦于视频的氛围或节奏&#xff0c;同时也为创作者提供了更多创意空间。选择恰当的背景音乐&#xff0c;…

【tower-boot 系列】开源RocketMQ和阿里云rockerMq 4.x和5.x集成 (一)

RocketMQ 简单介绍 阿里云rockerMq 4.x和5.x集成 一、云平台创建实例 参考文档&#xff1a; 阿里云api 阿里云 创建实例 二、skd集成思路 公司用的RocketMQ一般是自建开源apache的RocketMQ和上阿里云的RocketMQ&#xff0c;目前阿里云支持4.x和5.x版本 项目集成思路&…

【MAUI】CollectionView之 垂直网格

App主页或者导航页面中动态按钮的垂直网格布局 在 XAML 中,CollectionView 可以通过将其 ItemsLayout 属性设置为 VerticalGrid,在垂直网格中显示其项: <CollectionView ItemsSource="{Binding Monkeys}"ItemsLayout

链表面试编程题

1. 删除链表中等于给定值 val 的所有节点。 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 2. 反转一个单链表。206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间…

FOCShield v2.0.4原理图

1.FOCShield v2.0.4原理图,开源原文件用AD制作。用 AD09可以打开。 主要部分为 1.电机驱动芯片部分 2.电流采样部分

2024 全新体验:国学心理 API 接口来袭

在当今快节奏的生活中&#xff0c;人们对于心理健康越来越重视。而研究发现&#xff0c;国学心理学乃至传统文化中的思想智慧&#xff0c;对于人们的心理健康有着独特且深远的影响。为了让更多人能够体验到国学心理的魅力&#xff0c;2024年全新推出的国学心理 API 接口&#x…

Efficient Knowledge Infusion via KG-LLM Alignment

文章目录 题目摘要引言相关作品方法论实验设置和结果分析结论局限性附录 题目 通过KG-LLM比对实现高效的知识注入 论文地址&#xff1a;https://aclanthology.org/2024.findings-acl.176.pdf 摘要 为了解决大型语言模型中特定领域知识匮乏的问题&#xff0c;知识图检索扩充方…

27 Vue3之unocss原子化

前置知识 什么是原子化 CSS 原子化 CSS 是一种 CSS 的架构方式&#xff0c;它倾向于小巧且用途单一的 class&#xff0c;并且会以视觉效果进行命名。 为什么使用 原子化 CSS 传统方案 制作原子化 CSS 的传统方案其实就是提供所有你可能需要用到的 CSS 工具。例如&#xff0c…

ES索引生命周期管理

基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 &#xff1a;定时删除ES索引中的过期数据 1. ILM解决什么问题&#xff1f; ES从6.7版本引入ILM&#xff0c;通过ILM可以解决哪些问题呢? 自动新建…