HarmonyOS 鸿蒙Next 使用不依赖组件的Dialog如何禁用点击周围空白隐藏弹窗

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

HarmonyOS 鸿蒙Next 使用不依赖组件的Dialog如何禁用点击周围空白隐藏弹窗 根据开发文档[1]进行不依赖组件的弹窗使用,但是现在发现点击弹窗外可以关闭弹窗。请问如果将此功能禁用

2 回复

可以使用 onWillDismiss 方法。当用户执行点击遮障层关闭、左滑/右滑、三键 back、键盘 ESC 关闭交互操作时,如果注册该回调函数,则不会立刻关闭弹窗。在回调函数中可以通过 reason 得到阻拦关闭弹窗的操作类型,从而根据原因选择是否能关闭弹窗。

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-promptaction-V13#dismissreason12 枚举说明

参考代码:

import { BusinessError } from '@ohos.base';

import { ComponentContent } from "@ohos.arkui.node";

import { PromptAction } from '@kit.ArkUI';

// 弹框属性
export class Params {
    text: string = "";
    backgroundColor: string = "";
    opacity: number = 1;
    width: number = 0;
    height: number = 0;
    btnControl: string = '';
}

// 自定义弹框
@Builder
function buildText(params: Params) {
    Column() {
        Text(params.text || '默认内容')
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .margin({ bottom: 36 })
    }
    .width(params.width || 200)
    .height(params.height || 400)
    .backgroundColor(params.backgroundColor || '#FFF0F0F0')
    .opacity(params.opacity)
}

// 弹框控制
export function setDialog(uiContext: UIContext, promptAction: PromptAction, params: Params) {
    let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), params);

    try {
        promptAction.openCustomDialog(contentNode, {
            onWillDismiss: (dismissDialogAction: DismissDialogAction) => {
                if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
                    console.log('点击遮罩层事件:')

                    if (params.btnControl !== '关闭控制') {
                        dismissDialogAction.dismiss()
                    }
                }
            }
        });
    } catch (error) {
        let message = (error as BusinessError).message;
        let code = (error as BusinessError).code;

        console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
    }
}

@Entry
@Component
struct Index {
    @State message: string = "hello"
    private uiContext = this.getUIContext()
    private promptAction = this.getUIContext().getPromptAction()

    build() {
        Row() {
            Column() {
                Button("控制弹框关闭")
                    .margin(10)
                    .width('80%')
                    .onClick(() => {
                        let params: Params = new Params()
                        params.btnControl = '关闭控制'
                        setDialog(this.uiContext, this.promptAction, params)
                    })
            }
            .width('100%')
            .height('100%')
        }
        .height('100%')
    }
}

更多关于HarmonyOS 鸿蒙Next 使用不依赖组件的Dialog如何禁用点击周围空白隐藏弹窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,如果你想实现一个不依赖组件的Dialog,并且禁用点击周围空白区域隐藏弹窗的功能,可以通过以下方式实现:

  1. 自定义Dialog布局:首先,你需要自定义一个Dialog的布局文件,确保它包含你想要展示的内容。

  2. 设置Dialog属性:在创建Dialog实例时,可以通过设置相关属性来禁用点击外部区域隐藏的功能。通常,Dialog类会有一个方法或属性来控制这一行为,例如setCanceledOnTouchOutside(false)(注意:此方法名仅为示例,实际鸿蒙系统中可能有所不同,需查阅具体API文档)。

  3. 展示Dialog:使用自定义的布局和设置好的属性来展示Dialog。确保在展示Dialog的代码中没有启用点击外部隐藏的逻辑。

  4. 处理事件:如果需要,你可以在Dialog内部处理自己的点击事件,确保点击事件不会传播到Dialog外部导致隐藏。

由于鸿蒙系统的API可能与Android有所不同,具体实现细节需参考鸿蒙系统的官方文档或开发者指南。

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

回到顶部