【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案

简介: openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。


##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财#

一、前言

在HarmonyOS中使用openCustomDialog自定义弹框时,我们会遇到实现禁止手势关闭弹框的业务场景。
虽然在 HarmonyOS Next 中,自定义 Dialog 默认可能继承系统的侧滑返回手势,并且目前无法屏蔽,官方反馈未来版本可能会开放禁用选项。

在当前版本中,目前无法完全禁止手势关闭,但可以通过一些方法进行控制。例如,监听 onWillDismiss 事件可以在关闭时进行拦截,但需要处理不同的关闭原因。

华为官方文档明确提到了使用openCustomDialog时可以通过配置onWillDismiss回调来拦截关闭事件。在onWillDismiss中,可以检查DismissReason来判断关闭原因,例如用户滑动或点击外部。如果是手势关闭(如侧滑),可以通过返回false来阻止对话框关闭。可以通过监听onWillDismiss事件来禁止手势关闭。

openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。

二、方案思路

1. 定义自定义弹窗组件

import { PromptAction, DismissReason } from '@ohos.prompt';
@Builder
function CustomDialogContent() {
  return Column() {
    Text('禁止手势关闭的弹窗')
      .fontSize(24)
      .fontWeight(FontWeight.Bold)
    Button('确认关闭')
      .onClick(() => {
        // 主动关闭弹窗
        promptAction.closeCustomDialog(dialogId);
      })
  }
  .padding(30)
  .backgroundColor(Color.White)
  .borderRadius(16)
  .width('80%')
}

2. 打开弹窗并设置拦截逻辑

let promptAction = UIContext.getPromptAction();
let dialogId: number = 0;
promptAction.openCustomDialog({
  builder: () => CustomDialogContent(),
  alignment: DialogAlignment.Center,
  maskColor: 'rgba(0, 0, 0, 0.3)',
  autoCancel: false, // 禁止点击外部关闭
  onWillDismiss: (dismissAction) => {
    // 处理不同关闭原因
    switch (dismissAction.reason) {
      case DismissReason.SWIPE: // 侧滑关闭
      case DismissReason.BACK:   // 返回键关闭
        return false; // 阻止关闭
      default:
        return true; // 允许其他方式关闭
    }
  }
}).then(id => dialogId = id);

3. 关闭类型参数说明

参数

说明

autoCancel

控制是否允许点击外部关闭弹窗,设置为false可禁用该功能。

onWillDismiss

关闭事件回调函数,返回false可阻止关闭,返回true则允许关闭。

DismissReason

关闭原因枚举,包含SWIPE(侧滑)、BACK(返回键)等类型。

三、源码DEMO示例

import { PromptAction, DismissReason } from '@ohos.prompt';
@Entry
@Component
struct App {
  private promptAction: PromptAction = UIContext.getPromptAction();
  private dialogId: number = 0;
  build() {
    Column() {
      Button('打开禁止手势关闭的弹窗')
        .onClick(() => this.showDialog())
    }
  }
  showDialog() {
    this.promptAction.openCustomDialog({
      builder: () => this.CustomDialogContent(),
      alignment: DialogAlignment.Center,
      maskColor: 'rgba(0, 0, 0, 0.3)',
      autoCancel: false,
      onWillDismiss: (dismissAction) => {
        console.log(`关闭原因:${dismissAction.reason}`);
        return dismissAction.reason === DismissReason.BUTTON; // 仅允许按钮关闭
      }
    }).then(id => this.dialogId = id);
  }
  @Builder
  CustomDialogContent() {
    return Column() {
      Text('禁止手势关闭')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
      Button('确认关闭')
        .onClick(() => this.promptAction.closeCustomDialog(this.dialogId))
    }
    .padding(30)
    .backgroundColor(Color.White)
    .borderRadius(16)
    .width('80%')
  }
}

注意
综上所述,可在HarmonyOS中实现openCustomDialog的手势关闭拦截。对于需要完全禁止系统级手势的场景,建议结合页面级导航拦截逻辑进行处理。
系统限制

  • 在HarmonyOS Next系统中,部分系统级手势(如从屏幕边缘向内滑动返回)可能无法完全拦截。
  • 建议通过onWillDismiss回调配合页面级onBackPress拦截实现更全面的控制。
目录
相关文章
|
4月前
|
物联网 开发工具
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
121 9
【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)
|
4月前
|
存储 安全 API
【HarmonyOS 5】鸿蒙应用隐私保护详解
【HarmonyOS 5】鸿蒙应用隐私保护详解
163 1
|
4月前
|
前端开发 JavaScript API
【HarmonyOS 5】鸿蒙跨平台开发方案详解(一)
2025年是鸿蒙生态迎来关键发展期。根据前几天的2025 HDC数据显示,鸿蒙原生应用数量已从2024年的2000款增长至5000款,微信鸿蒙版安装量突破1.2亿,公安部交管系统完成全国300城鸿蒙适配。
302 1
|
4月前
|
定位技术 开发工具 开发者
【HarmonyOS 5】桌面快捷方式功能实现详解
在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。 鸿蒙系统提供的**桌面快捷方式(Shortcuts)**功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用图标即可快速启动特定功能,大幅减少操作层级。 本文将结合地图导航场景,详细解析鸿蒙快捷方式的实现原理与开发流程。结合华为官方开源示例 DesktopShortcut 展开,该示例基于HarmonyOS 5.0实现,完整演示了地图导航场景的快捷方式开发流程。
236 0
|
4月前
|
传感器 自动驾驶 物联网
【HarmonyOS 5】鸿蒙星闪NearLink详解
鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务,支持星闪设备间的连接、数据交互。例如,手机可作为中心设备与外围设备(如鼠标、手写笔、智能家电、车钥匙等)通过星闪进行连接。
130 0
|
4月前
|
监控 JavaScript 开发工具
【HarmonyOS 5】鸿蒙中@State的原理详解
@State 是 HarmonyOS ArkTS 框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动 UI 的响应式编程模式。通过将变量标记为 @State,开发者可以确保当状态值发生变化时,依赖该状态的 UI 组件会自动重新渲染,从而保持数据与界面的实时同步。 @State 是 HarmonyOS ArkTS 实现响应式编程的大基础核心,可以说整个V1和V2都是围绕它来进行组合使用。
166 0
|
4月前
|
移动开发 Dart 前端开发
【HarmonyOS 5】鸿蒙跨平台开发方案详解(二)
作为最早实现鸿蒙适配的跨平台框架,Flutter在社区推动下已形成较完整的技术方案。当前鸿蒙版Flutter已发布3.22.0-ohos版本,该版本基于Flutter 3.22.0核心。
263 0
|
4月前
|
消息中间件 物联网 开发工具
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
236 0
|
4月前
|
人工智能 自然语言处理 IDE
【HarmonyOS 5】鸿蒙CodeGenie AI辅助编程工具详解
1、CodeGenie是什么? CodeGenie (代码精灵)作为鸿蒙DevEco IDE自带的AI辅助编码工具。
172 0
|
7月前
|
开发者 容器
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍
本文详细介绍了HarmonyOS页面跳转解决方案——HMRouter的使用方法,帮助开发者快速上手。HMRouter封装了系统Navigation能力,提供路由拦截、页面生命周期管理、自定义转场动画等功能,简化开发流程。文章通过具体示例讲解模块内及跨模块页面跳转、路由传参、自定义动画、拦截器和生命周期管理等核心功能。同时,提供了丰富的资源链接,包括接口文档、高级动画教程和常见问题解答,适合初学者系统学习HMRouter的使用与原理。
482 9
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍