「HarmonyOS」CustomDialogController自定义弹窗使用方法

需求背景:

在开发的过程中,总会遇到一些功能需要使用到弹窗进行信息的输入和修改,如用户个人信息的修改;在UI设计上每个App通常都会有各自的样式,而不是使用系统的标准样式,所以通常我们需要进行自定义弹窗来实现信息填写需求

模块介绍

在ArkTs中,CustomDialogController提供这个对应功能,如下是在官方文档中的介绍:

通过CustomDialogController类显示自定义弹窗。使用弹窗组件时,可优先考虑自定义弹窗,便于自定义弹窗的样式与内容。

样式展示

先进行样式展示一下,然后根据这个样式进行代码编写
在这里插入图片描述

这是当输入有误时的样式,当输入超过限制字符数量时,会展示错误提示,并且不能继续添加输入,当删除后字数小于限制字数时,错误提示消失
在这里插入图片描述

实践操作

该自定义弹窗需要复用,需要用时给于修改昵称和修改个性签名使用,所以在标题,输入框提示语等内容上会有所不同

1.创建自定义弹窗样式

需要使用@CustomDialog装饰器来表达这是一个自定义弹窗

@CustomDialog
struct UserInputDialogView {// 弹窗标题@State dialogViewTitle: string = ''// 输入框提示语@State placeHolderContent: string = ''// 是否展示错误提示@State isShowErrorMsg: boolean = false// 是否超过了字数限制@State MoreMaxLength: boolean = false// 输入的内容@State textValue: string = ''// 最大输入字符数字inputMaxNumber: numbercontroller: CustomDialogController// 取消方法回调cancel: () => void// 确认方法回调confirm: (text: string) => voidbuild() {Column() {Row() {Text(this.dialogViewTitle).fontSize(16).fontColor($r('app.color.24292B')).fontWeight(FontWeight.Medium)}.justifyContent(FlexAlign.Center).alignItems(VerticalAlign.Center).width(BaseUtils.screenWidth - 38).height(24).margin({top: 16})// 直接引用输入框提示内容和输入内容TextInput({placeholder: this.placeHolderContent, text: this.textValue}).width(BaseUtils.screenWidth - 64).height(56).backgroundColor($r('app.color.F5F5F5')).caretColor($r('app.color.FF8000')).borderRadius(8).margin({top: 16}).type(InputType.Normal)// 用于打开弹窗后,焦点直接落在弹窗上,以便于直接弹出输入键盘.key('popUpKeyboard').onFocus(() => {sendEventByKey('popUpKeyboard', 10, '弹出键盘')}).onChange((value) => {this.textValue = valueif (value.length > this.inputMaxNumber) {// 如果输入内容超过限制字符,展示错误提示this.MoreMaxLength = truethis.textValue = this.textValue.substring(0,this.inputMaxNumber)} else if (value.length == this.inputMaxNumber) {// 如果输入内容长度等于限制字符// 如果为刚好等于则不展示// 如果已超出限制字符则展示错误提示if (this.MoreMaxLength) {this.isShowErrorMsg = true}} else {this.isShowErrorMsg = falsethis.MoreMaxLength = false}})// 错误提示if (this.isShowErrorMsg) {Text(`最多不超过${this.inputMaxNumber}个字`).fontSize(12).fontColor($r('app.color.F7313B')).fontWeight(FontWeight.Regular).textAlign(TextAlign.Start).width(BaseUtils.screenWidth - 72).margin({top: 2})}Flex({direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween}) {Button('取消').fontSize(16).fontColor($r('app.color.24292B')).fontWeight(FontWeight.Medium).backgroundColor($r('app.color.F7F7F7')).size({width: 144, height: 44}).borderRadius(22).onClick(() => {this.controller.close()this.cancel()})Button('确定').fontSize(16).fontColor(this.textValue.length == 0 ? $r('app.color.FFFFFF_50') : $r('app.color.FFFFFF')).fontWeight(FontWeight.Medium).backgroundColor(this.textValue.length == 0 ? $r('app.color.FF8000_50') : $r('app.color.FF8000')).size({width: 144, height: 44}).borderRadius(22).enabled(this.textValue.length == 0 ? false : true).margin({left: 25}).onClick(() => {// 确认按钮 返回输入文本内容,并且关闭自定义弹窗this.confirm(this.textValue)this.controller.close()})}.width(BaseUtils.screenWidth - 64).height(44).margin({top: this.isShowErrorMsg ? 8 : 24})}.alignItems(HorizontalAlign.Center).width(BaseUtils.screenWidth).backgroundColor($r('app.color.FFFFFF')).height(215).borderRadius(16)}
}
2.初始化自定义弹窗

以修改个性签名弹窗为例

userSignDialogController: CustomDialogController = new CustomDialogController({builder: UserInputDialogView({dialogViewTitle: '个性签名',placeHolderContent: '请输入个性签名(限制15个字)',inputMaxNumber: 15,cancel: () => {},confirm: (text: string) => {// 修改个性签名请求 HttpApiManager.getInstance().updateUserInfo(new UserInfoBean(null, null, text)).then((data: UserInfoBean) => {this.userInfo = data// 用户数据更新通知// 具体可见我《EventHub事件通知详细使用方法》文章EventHubUtil.emit('updateUserInfo')ToastUtil.getInstance().showToast('修改成功')}).catch(error => {ToastUtil.getInstance().showToast(error.message)})},}),// 是否点击弹窗其他地方蒙层关闭autoCancel: true,// 弹窗在竖直方向上的对齐方式alignment: DialogAlignment.Default,// 是否使用自定义样式customStyle: true})
3.销毁自定义弹窗

在页面销毁前,需销毁自定义弹窗,以避免系统资源浪费

aboutToDisappear() {delete this.userSignDialogController,this.userSignDialogController = undefined}
4.调用/打开自定义弹窗

在摁钮或者View的onClick方法中进行调用方法以实现点击打开

if (this.userSignDialogController != undefined) {this.userSignDialogController.open()
}
5.关闭自定义弹窗

这个在自定义弹窗的取消和确认按钮中有写入该方法

//  取消按钮的点击事件
.onClick(() => {// 关闭自定义弹窗this.controller.close()this.cancel()
})
参考文档

自定义弹窗API
自定义弹窗(CustomDialog)指南

当前HarmonyOs仍在初步学习过程中,大家如果感兴趣或者有问题可以一起沟通交流
如果该文章对你有所帮助的话,可以点赞、收藏并关注一下!后续会持续更新更多技术内容

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云开发超多功能工具箱组合微信小程序源码/附带流量主

这是一款云开发超多功能工具箱组合微信小程序源码附带流量主功能,小程序内包含了40余个功能,堪称全能工具箱了,大致功能如下: 证件照制作 | 垃圾分类查询 | 个性签名制作 二维码生成丨文字九宫格 | 手持弹幕丨照片压缩 | 照片编…

【C#】MVVM架构

示例结果展示 前提了解 MVVM是Model-View-ViewModel的缩写形式,它通常被用于WPF或Silverlight开发。 Model——可以理解为带有字段,属性的类。例如学校类,教师类,学生类等 View——可以理解为我们所看到的UI。前端界面。 View Model在View和Model之间,起到连接的作用,…

echarts图表插件

图表组件 ECharts,全称为Enterprise Charts,是一个使用JavaScript实现的开源可视化库。它主要用于数据可视化领域,能够方便地创建出直观、交互性强的图表。ECharts由百度团队开发,目前是Apache的顶级项目之一。ECharts支持的图表…

12. UE5 RPG使用GameplayEffect修改角色属性(三)

书接 11. UE5 RPG使用GameplayEffect修改角色属性(二) 前面,介绍了GameplayEffect的Instant和Duration的使用,这一篇主要介绍一下无限制时间类型的infinite的使用方式。 无限时间限制模式下,如果你的周期时间&#xff…

程序员知识点:Java和JavaScript有哪些区别与联系?

Java 和 JavaScript 是两种不同的编程语言,它们有以下区别和联系: 区别: 设计目的不同:Java 是一种面向对象的编程语言,主要用于企业级应用程序开发、移动应用程序开发等领域。而 JavaScript 是一种脚本语言&#xff…

leetcode 算法 67.二进制求和(python版)

需求 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” 输出:“10101” 代码 class Solution…

《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)

文章目录 1.1 Git 简介:版本控制的演变1.1.1 基础知识讲解1.1.2 重点案例:协作开发流程优化案例:功能开发与分支策略 1.1.3 拓展案例 1:代码审查与合并1.1.4 拓展案例 2:冲突解决 1.2 安装和配置 Git:首次设…

Vision Transformer(一):自注意力机制

1. 注意力机制 注意力本质上是模仿人的行为。这种行为可以描述为人在观察一些事物时,会对感兴趣的区域会产生更多的聚焦,而会选择性的忽视(或者减少关注)另一些区域。 举个简单的例子,一些对跑车感兴趣的人&#xff0…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

AVR 328pb触摸功能基本介绍和使用

AVR 328pb触摸功能基本介绍和使用 📝ATMEGA328PB-AU外设中带外围触摸控制器(PTC)电容式触摸按钮、滑块和轮子24个自帽通道和144个互帽通道。(ATMEGA328P没有的) ✅PTC-外围触摸控制器 🍃低功耗、高灵敏度、…

【python】绘制爱心图案

以下是一个简单的Python代码示例,它使用turtle模块绘制一个代表爱和情人节的心形图案。 首先,请确保计算机上安装了Python和turtle模块。然后,将以下代码保存到一个.py文件中,运行它就可以看到爱心图案的绘制过程。 import turt…

24、数据结构/排序相关练习20240206

一、现有无序序列数组为{23,24,12,5,33,5,34,7},请使用以下排序实现编程。 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现…