鸿蒙 自定义弹框(CustomDialog)

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、弹出框的类型

1. 模态与非模态

  • 默认模态:有蒙层,不可与蒙层下方控件交互(点击/手势不透传)。

  • 非模态:可通过设置 isModal: false 实现,允许弹出框与页面同时交互。

2. 页面级与非页面级

  • 默认非页面级:路由跳转时不会自动关闭,需手动调用 close()

  • 页面级弹窗:可使用组件导航子页面或页面级弹出框实现。

二、生命周期

从 API Version 19 开始,自定义弹出框提供以下生命周期回调:

名称类型说明
onWillAppearCallback<void>显示动效前触发
onDidAppearCallback<void>弹出后触发
onWillDisappearCallback<void>退出动效前触发
onDidDisappearCallback<void>消失后触发

三、创建自定义弹出框

1. 使用 @CustomDialog 装饰器定义弹出框内容

@CustomDialog
struct CustomDialogExample {
  controller?: CustomDialogController
  build() {
    Column() {
      Text('内容。。。').fontSize(20)
    }
  }
}

2. 在组件中创建控制器并绑定

@Entry
@Component
struct CustomDialogUser {
  dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogExample()
  })

  build() {
    Column() {
      Button('click open')
        .onClick(() => {
          this.dialogController.open()
        })
    }
  }
}

四、弹出框的交互

1. 添加按钮与回调函数

@CustomDialog
struct CustomDialogExample {
  cancel: () => void
  confirm: () => void
  controller?: CustomDialogController

  build() {
    Column() {
      Text('内容。。。').margin({ top: 10, bottom: 10 })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('cancel')
          .onClick(() => {
            this.controller?.close()
            this.cancel?.()
          })
        Button('confirm')
          .onClick(() => {
            this.controller?.close()
            this.confirm?.()
          })
      }
    }
  }
}

2. 在父组件中传递回调

dialogController: CustomDialogController = new CustomDialogController({
  builder: CustomDialogExample({
    cancel: () => { this.onCancel() },
    confirm: () => { this.onAccept() }
  })
})

五、动画控制

可通过 openAnimation 配置出现动画:

new CustomDialogController({
  builder: CustomDialogExample(),
  openAnimation: {
    duration: 1200,
    curve: Curve.Friction,
    delay: 500,
    playMode: PlayMode.Alternate,
    onFinish: () => { console.info('finish') }
  }
})

六、样式控制

支持设置宽度、高度、背景色、边框、阴影、圆角等样式:

new CustomDialogController({
  builder: CustomDialogExample(),
  width: '80%',
  height: '100px',
  backgroundColor: 0xd9ffffff,
  cornerRadius: 20,
  borderWidth: 1,
  borderStyle: BorderStyle.Dashed,
  borderColor: Color.Blue,
  shadow: {
    radius: 20,
    color: Color.Grey,
    offsetX: 50,
    offsetY: 0
  }
})

七、物理返回拦截

通过 onWillDismiss 回调拦截关闭操作:

new CustomDialogController({
  builder: CustomDialogExample(),
  onWillDismiss: (action: DismissDialogAction) => {
    if (action.reason === DismissReason.PRESS_BACK) {
      // 处理逻辑,可调用 action.dismiss() 关闭
    }
  }
})

八、软键盘避让

从 API Version 15 开始支持:

new CustomDialogController({
  builder: CustomDialogExample(),
  keyboardAvoidMode: KeyboardAvoidMode.DEFAULT,
  keyboardAvoidDistance: LengthMetrics.vp(0)  // 与键盘间距
})

备注

  1. 弹出框关闭后建议在 aboutToDisappear 中将 controller 置空,防止内存泄漏。

  2. 非模态弹窗允许与页面同时交互,模态弹窗则会阻断页面交互。

<think>好的,我需要帮助用户了解鸿蒙系统中的实现方法或功能使用教程。根据用户提供的引用内容,特别是引用[3],里面提到分为确认类、选择类以及自定义,比如AlertDialog、TextPickerDialog等。首先,我应该整理这些信息,并按照用户的要求结构化回答。 首先,用户需要的是实现方法和功能使用教程,所以我应该分步骤讲解如何创建不同类型的。引用[3]中提到了AlertDialog、DatePickerDialogCustomDialog,这些可以作为例子。另外,用户要求使用中文回答,并且所有的数学表达式需要用$...$格式,但这里可能不太涉及数学公式,所以可能不需要处理这部分。但需要注意代码块的使用,以及引用标识的添加。 接下来,我需要确保回答结构清晰,帮助用户逐步解决问题。可能需要分点说明的类型,然后每种类型给出代码示例,如AlertDialog的使用步骤,DatePickerDialog的实现方法,以及如何自定义CustomDialog。同时,根据用户提供的引用,在适当的位置添加引用标识,比如在讨论分类时引用[^3]。 另外,用户要求生成相关问题,我需要根据内容提出三个相关问题,比如如何自定义样式、的事件处理,以及不同的应用场景。这些问题需要与用户的问题相关,并且能够引导进一步学习。 需要检查LaTeX语法是否正确,但用户的问题主要涉及代码和功能说明,可能不需要数学公式。不过如果有提到变量或方法参数,可能需要用行内格式,比如$参数$,但不确定是否需要,所以暂时忽略。 最后,确保回答中引用的部分末尾自然添加引用标识,例如在提到分类时加上。代码块需要正确使用鸿蒙开发的语法,比如ArkTS的示例代码,可能需要参考引用中的内容,但用户提供的引用[3]中的代码示例可能不够详细,所以可能需要根据鸿蒙开发文档补充,但用户可能希望基于现有引用内容来回答。 总结步骤: 1. 分类型介绍:确认类、选择类、自定义。 2. 每种类型给出实现步骤和代码示例。 3. 添加引用标识到对应的部分。 4. 生成相关问题。</think>### 鸿蒙系统功能实现方法及使用教程 #### 一、类型及功能 鸿蒙系统中的Dialog)主要用于**临时交互**,需用户主动处理信息或操作。根据功能可分为以下三类: 1. **确认类**(如`AlertDialog`):用于信息提示或操作确认。 2. **选择类**(如`TextPickerDialog`、`DatePickerDialog`):提供时间、日期等选择功能。 3. **自定义**(`CustomDialog`):支持完全自定义布局和样式。 --- #### 二、实现方法示例 ##### 1. 基础确认(AlertDialog) **步骤**: 1. 导入组件:`import { AlertDialog } from '@ohos.arkui.advanced'` 2. 定义内容与按钮事件: ```typescript // 触发 function showAlertDialog() { AlertDialog.show({ title: '确认删除', message: '确定要删除此文件吗?', buttons: [ { text: '取消', color: '#666666', action: () => { console.log('取消操作') } }, { text: '确认', color: '#007DFF', action: () => { deleteFile() } // 实际业务逻辑 } ] }) } ``` ##### 2. 日期选择(DatePickerDialog) ```typescript // 日期选择 DatePickerDialog.show({ date: new Date(), onAccept: (selectedDate) => { console.log(`选择的日期: ${selectedDate.toLocaleDateString()}`) } }) ``` ##### 3. 自定义CustomDialog) **步骤**: 1. 创建自定义布局文件`CustomDialog.ets` 2. 继承`CustomDialogController`实现控制器: ```typescript @CustomDialog struct CustomDialogExample { controller: CustomDialogController build() { Column() { Text('自定义标题').fontSize(20) Button('关闭').onClick(() => { this.controller.close() }) } .padding(20) } } // 调用 const dialogController = new CustomDialogController({ builder: CustomDialogExample() }) dialogController.open() ``` --- #### 三、核心注意事项 1. **事件阻断**:显示期间会阻断下层页面交互。 2. **生命周期**:关闭时需手动释放资源。 3. **样式规范**:建议遵循鸿蒙设计规范(如按钮排列顺序、主色调使用)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值