HarmonyOS 鸿蒙Next 应用级全局弹框

发布于 1周前 作者 nodeper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 应用级全局弹框

实现应用级全局弹框

1、不管当前是在哪个页面,都能弹出来,基本排除Navigation

2、弹框点击返回按钮不会消失,排除系统dialog

3、不需要任何权限,如系统弹框

3 回复
目前自定义弹窗不支持全局拉起。只能使用promptAction.openCustomDialog可以全局拉起,但是需要在挂载在某个struct下面,参考文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/js-apis-promptAction.md#promptactionopencustomdialog11

promptAction.openCustomDialog 全局弹窗参考代码如下:

一、新建3个工具类

1、GlobalContext.ets

export class GlobalContext {

private constructor() { }

private static instance: GlobalContext; private _objects = new Map<string, Object>();

public static getContext(): GlobalContext { if (!GlobalContext.instance) { GlobalContext.instance = new GlobalContext(); } return GlobalContext.instance; }

getObject(value: string): Object | undefined { return this._objects.get(value); }

setObject(key: string, objectClass: Object): void { this._objects.set(key, objectClass); } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

2、DialogUtils.ets

import { promptAction } from ‘@kit.ArkUI’
import { GlobalContext } from ‘./GlobalContext’

@Builder export function customDialogBuilder(content: String) { Column() { Text(Tip: ${content}).fontSize(20).height(“30%”) Text(‘失败原因:失败原因失败原因失败原因失败原因失败原因失败原因失败原因!’).fontSize(16).height(“30%”) Row() { Button(“确认”).onClick(() => { promptAction.closeCustomDialog(getCustomDialogId()) }) Blank().width(50) Button(“取消”).onClick(() => { promptAction.closeCustomDialog(getCustomDialogId()) }) } .margin({ top: 30 }) }.height(200).padding(5) }

function getCustomDialogId() {

// 取customDialogId let customDialogId = GlobalContext.getContext().getObject(‘customDialogId’) as number return customDialogId; }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

3、HttpUtil.ets

import { GlobalContext } from ‘./GlobalContext’;
import { promptAction } from ‘@kit.ArkUI’;
import { customDialogBuilder } from ‘./DialogUtils’;

export function testPromptDialog() {

// 方法调用后使用弹窗 // 使用GlobalContext中UIContext const that = GlobalContext.getContext().getObject(‘UIContext’) as UIContext;

if (that) { promptAction.openCustomDialog({ builder: customDialogBuilder.bind(that, “网络请求失败!”) }).then((dialogId: number) => { GlobalContext.getContext().setObject(‘customDialogId’, dialogId) }) } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

二、页面测试弹窗效果

1、Index.ets

import { GlobalContext } from ‘…/utils/GlobalContext’
import { router } from ‘@kit.ArkUI’

@Entry @Component struct Index {

aboutToAppear(): void {

<span class="hljs-comment"><span class="hljs-comment">// 存入UIContext与customDialogId</span></span>
GlobalContext.getContext().setObject(<span class="hljs-string"><span class="hljs-string">'UIContext'</span></span>, <span class="hljs-keyword"><span class="hljs-keyword">this</span></span>)
GlobalContext.getContext().setObject(<span class="hljs-string"><span class="hljs-string">'customDialogId'</span></span>, <span class="hljs-number"><span class="hljs-number">0</span></span>)

}

build() { Row() { Column() { Button(“跳转其他页面”) .onClick(() => { router.pushUrl({ url: “pages/Page2” }) }) } .width(‘100%’) } .height(‘100%’) } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

2、Page2.ets

import { testPromptDialog } from ‘…/utils/HttpUtil’;

@Entry @Component struct Page2 {

@State message: string = ‘Hello World’;

build() { Row() { Column() { Button(“promptAction弹窗”) .onClick(() => { testPromptDialog() }) } .width(‘100%’) } .height(‘100%’) } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

可以调用onWillDismiss 这个属性去控制侧滑返回或者点击空白区域弹框不消失,具体用法可以参考链接

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-software-download-0000001507075446-V5?catalogVersion=V5

为什么要排除Navigation,不是很理解

针对HarmonyOS 鸿蒙Next应用级全局弹框的问题,以下提供一种专业的实现思路:

在HarmonyOS 鸿蒙Next上,全局弹框的实现可以通过利用系统提供的WindowStage和Window API来完成。首先,在应用的启动类EntryAbility中,通过WindowStage的onWindowStageCreate生命周期接口获取WindowStage对象。然后,利用WindowStage的createSubWindow方法创建一个子窗口。通过子窗口的moveWindowTo和resize方法,可以设置弹框的位置和大小。接下来,通过setUIContent方法加载弹框的UI内容,这通常是一个ETS页面。最后,通过showWindow和destroyWindow方法控制弹框的显示和关闭。

需要注意的是,为了确保弹框能够正常显示,需要在src/main/resources/base/profile/main_pages.json中配置ETS页面。此外,还需要处理工具类和ETS页面之间的通信问题,这可以通过Emitter进行线程间通信来实现。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部