HarmonyOS4.0从零开始的开发教程11给您的应用添加弹窗

HarmonyOS(十)给您的应用添加弹窗

概述

在我们日常使用应用的时候,可能会进行一些敏感的操作,比如删除联系人,这时候我们给应用添加弹窗来提示用户是否需要执行该操作,如下图所示:

点击放大

弹窗是一种模态窗口,通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前,用户无法操作其他界面内容。ArkUI为我们提供了丰富的弹窗功能,弹窗按照功能可以分为以下两类:

  • 确认类:例如警告弹窗AlertDialog。
  • 选择类:包括文本选择弹窗TextPickerDialog 、日期滑动选择弹窗DatePickerDialog、时间滑动选择弹窗TimePickerDialog等。

您可以根据业务场景,选择不同类型的弹窗。部分弹窗效果图如下:

点击放大

此外,如果上述弹窗还不能满足您的需求,或者需要对弹窗的布局和样式进行自定义,您还可以使用自定义弹窗CustomDialog。

下文将分别介绍AlertDialog 、TextPickerDialog 、DatePickerDialog以及CustomDialog的使用。

警告弹窗

警告弹窗AlertDialog由以下三部分区域构成,对应下面的示意图:

  1. 标题区:为可选的。
  2. 内容区:显示提示消息。
  3. 操作按钮区:用户做”确认“或者”取消“等操作。

点击放大

以下示例代码,演示了如何使用AlertDialog 实现上图所示的警告弹窗。AlertDialog可以设置两个操作按钮,示例代码中分别使用primaryButton和secondaryButton实现了“取消”和“删除”操作按钮,操作按钮可以通过action响应点击事件。

Button('点击显示弹窗')
  .onClick(() => {
    AlertDialog.show(
      {
        title: '删除联系人', // 标题
        message: '是否需要删除所选联系人?', // 内容
        autoCancel: false, // 点击遮障层时,是否关闭弹窗。
        alignment: DialogAlignment.Bottom, // 弹窗在竖直方向的对齐方式
        offset: { dx: 0, dy: -20 }, // 弹窗相对alignment位置的偏移量
        primaryButton: {
          value: '取消',
          action: () => {
            console.info('Callback when the first button is clicked');
          }
        },
        secondaryButton: {
          value: '删除',
          fontColor: '#D94838',
          action: () => {
            console.info('Callback when the second button is clicked');
          }
        },
        cancel: () => { // 点击遮障层关闭dialog时的回调
          console.info('Closed callbacks');
        }
      }
    )
  })

此外,您还可以使用AlertDialog,构建只包含一个操作按钮的确认弹窗,使用confirm响应操作按钮回调。

AlertDialog.show(
  {
    title: '提示',
    message: '提示信息',
    autoCancel: true,
    alignment: DialogAlignment.Bottom,
    offset: { dx: 0, dy: -20 },
    confirm: {
      value: '确认',
      action: () => {
        console.info('Callback when confirm button is clicked');
      }
    },
    cancel: () => {
      console.info('Closed callbacks')
    }
  }
)

选择类弹窗

选择类弹窗用于方便用户选择相关数据,比如选择喜欢吃的水果、出生日期等等。下面我们以TextPickerDialog和DatePickerDialog为例,来介绍选择类弹窗的使用。

文本选择弹窗

TextPickerDialog为文本滑动选择器弹窗,根据指定的选择范围创建文本选择器,展示在弹窗上,例如下面这段示例代码使用TextPickerDialog实现了一个水果选择弹窗。示例代码中使用selected指定了弹窗的初始选择项索引为2,对应的数据为“香蕉”。当用户点击“确定”操作按钮后,会触发onAccept事件回调,在回调中将选中的值,传递给宿主中的select变量。

@Entry
@Component
struct TextPickerDialogDemo {
  @State select: number = 2;
  private fruits: string[] = ['苹果', '橘子', '香蕉', '猕猴桃', '西瓜'];

  build() {
    Column() {
      Button("TextPickerDialog")
        .margin(20)
        .onClick(() => {
          TextPickerDialog.show({
            range: this.fruits, // 设置文本选择器的选择范围
            selected: this.select, // 设置初始选中项的索引值。
            onAccept: (value: TextPickerResult) => { // 点击弹窗中的“确定”按钮时触发该回调。
              // 设置select为按下确定按钮时候的选中项index,这样当弹窗再次弹出时显示选中的是上一次确定的选项
              this.select = value.index;
              console.info("TextPickerDialog:onAccept()" + JSON.stringify(value));
            },
            onCancel: () => { // 点击弹窗中的“取消”按钮时触发该回调。
              console.info("TextPickerDialog:onCancel()");
            },
            onChange: (value: TextPickerResult) => { // 滑动弹窗中的选择器使当前选中项改变时触发该回调。
              console.info("TextPickerDialog:onChange()" + JSON.stringify(value));
            }
          })
        })
    }
    .width('100%')
  }
}

效果图如下:

点击放大

日期选择弹窗

下面我们介绍另一种常用的选择类弹窗DatePickerDialog,它是日期滑动选择器弹窗,根据指定的日期范围创建日期滑动选择器,展示在弹窗上。DatePickerDialog的使用非常广泛,比如当我们需要输入个人出生日期的时候,就可以使用DatePickerDialog。下面的示例代码实现了一个日期选择弹窗:

@Entry
@Component
struct DatePickerDialogDemo {
  selectedDate: Date = new Date("2010-1-1")

  build() {
    Column() {
      Button("DatePickerDialog")
        .margin(20)
        .onClick(() => {
          DatePickerDialog.show({
            start: new Date("1900-1-1"), // 设置选择器的起始日期
            end: new Date("2023-12-31"), // 设置选择器的结束日期
            selected: this.selectedDate, // 设置当前选中的日期
            lunar: false,
            onAccept: (value: DatePickerResult) => { // 点击弹窗中的“确定”按钮时触发该回调
              // 通过Date的setFullYear方法设置按下确定按钮时的日期,这样当弹窗再次弹出时显示选中的是上一次确定的日期
              this.selectedDate.setFullYear(value.year, value.month, value.day)
              console.info("DatePickerDialog:onAccept()" + JSON.stringify(value))
            },
            onCancel: () => { // 点击弹窗中的“取消”按钮时触发该回调
              console.info("DatePickerDialog:onCancel()")
            },
            onChange: (value: DatePickerResult) => { // 滑动弹窗中的滑动选择器使当前选中项改变时触发该回调
              console.info("DatePickerDialog:onChange()" + JSON.stringify(value))
            }
          })
        })
    }
    .width('100%')
  }
}

效果图如下:

点击放大

自定义弹窗

自定义弹窗的使用更加灵活,适用于更多的业务场景,在自定义弹窗中您可以自定义弹窗内容,构建更加丰富的弹窗界面。自定义弹窗的界面可以通过装饰器@CustomDialog定义的组件来实现,然后结合CustomDialogController来控制自定义弹窗的显示和隐藏。下面我们通过一个兴趣爱好的选择框来介绍自定义弹窗的使用。

点击放大

从上面的效果图可以看出,这个选择框是一个多选的列表弹窗,我们可以使用装饰器@CustomDialog,结合List组件来完成这个弹窗布局,实现步骤如下:

  1. 初始化弹窗数据。

    先准备好资源文件和数据实体类。其中资源文件stringarray.json创建在resources/base/element目录下,文件根节点为strarray。

    {
      "strarray": [
        {
          "name": "hobbies_data",
          "value": [
            {
              "value": "Soccer"
            },
            {
              "value": "Badminton"
            },
            {
              "value": "Travelling"
            },
            ... 
          ]
        }
      ]
    }
    

    实体类HobbyBean用来封装自定义弹窗中的"兴趣爱好"数据。

    export default class HobbyBean {
      label: string;
      isChecked: boolean;
    }
    

    然后创建一个ArkTS文件CustomDialogWidget,用来封装自定义弹窗,使用装饰器@CustomDialog修饰CustomDialogWidget表示这是一个自定义弹窗。使用资源管理对象manager获取数据,并将数据封装到hobbyBeans。

    @CustomDialog
    export default struct CustomDialogWidget {
      @State hobbyBeans: HobbyBean[] = [];
    
      aboutToAppear() {
        let context: Context = getContext(this);
        let manager = context.resourceManager;
        manager.getStringArrayValue($r('app.strarray.hobbies_data'), (error, hobbyResult) => {
          ...
          hobbyResult.forEach((hobbyItem: string) => {
            let hobbyBean = new HobbyBean();
            hobbyBean.label = hobbyItem;
            hobbyBean.isChecked = false;
            this.hobbyBeans.push(hobbyBean);
          });
        });
      }
    
      build() {...}
    }
    
  2. 创建弹窗组件。

    controller对象用于控制弹窗的控制和隐藏,hobbies表示弹窗选中的数据结果。setHobbiesValue方法用于筛选出被选中的数据,赋值给hobbies。

    @CustomDialog
    export default struct CustomDialogWidget {
      @State hobbyBeans: HobbyBean[] = [];
      @Link hobbies: string;
      private controller: CustomDialogController;
    
      aboutToAppear() {...}
    
      setHobbiesValue(hobbyBeans: HobbyBean[]) {
        let hobbiesText: string = '';
        hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) =>
        isCheckItem?.isChecked)
          .map((checkedItem: HobbyBean) => {
            return checkedItem.label;
          }).join(',');
        this.hobbies = hobbiesText;
      }
    
      build() {
        Column() {
          Text($r('app.string.text_title_hobbies'))...
          List() {
            ForEach(this.hobbyBeans, (itemHobby: HobbyBean) => {
              ListItem() {
                Row() {
                  Text(itemHobby.label)...
                  Toggle({ type: ToggleType.Checkbox, isOn: false })...
                    .onChange((isCheck) => {
                      itemHobby.isChecked = isCheck;
                    })
                }
              }
            }, itemHobby => itemHobby.label)
          }
    
          Row() {
            Button($r("app.string.cancel_button"))...
              .onClick(() => {
                this.controller.close();
              })
            Button($r("app.string.definite_button"))...
              .onClick(() => {
                this.setHobbiesValue(this.hobbyBeans);
                this.controller.close();
              })
          }
        }
      }
    }
    
  3. 使用自定义弹窗。

    在自定义弹窗的使用页面HomePage中先定义一个变量hobbies,使用装饰器@State修饰,和自定义弹窗中的@Link 装饰器修饰的变量进行双向绑定。然后我们使用alignment和offset设置弹窗的位置在屏幕底部,并且距离底部20vp。最后我们在自定义组件TextCommonWidget(具体实现可以参考《构建多种样式弹窗》Codelab源码)的点击事件中,调用customDialogController的open方法,用于显示弹窗。

    @Entry
    @Component
    struct HomePage {
      customDialogController: CustomDialogController = new CustomDialogController({
        builder: CustomDialogWidget({
          onConfirm: this.setHobbiesValue.bind(this),
        }),
        alignment: DialogAlignment.Bottom,
        customStyle: true,
        offset: { dx: 0,dy: -20 }
      });
    
      setHobbiesValue(hobbyArray: HobbyBean[]) {...}
    
      build() {
        ...
          TextCommonWidget({
            ...
            title: $r("app.string.title_hobbies"),
            content: $hobby,
            onItemClick: () => {
              this.customDialogController.open();
            }
          })
        ...
      }
    }
    

参考

关于更多弹窗,您可以参考:

警告弹窗

列表选择弹窗

自定义弹窗

日期滑动选择弹窗

时间滑动选择弹窗

文本滑动选择弹窗

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql面试题——日志

一:为什么需要REDO日志 缓冲池可以帮助我们消除CPU和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘,然而由于checkpoint 并不是每次变更的时候就触发 的,而是master线程隔一段时间去处理的。所以最坏的情况就是事务提交后…

GLAB | CCNA+HCIA=融合课-最新开课通知

敲重点! 12月17日 CCNAHCIA 周日开课啦! CCNA(Cisco Certified Network Associate)认证是Cisco售后工程师认证体系的入门认证,也是Cisco各项认证中级别最低的技术认证通过CCNA认证可证明你已掌握网络的基本知识,并能…

DL Homework 9

目录 1 知识总结 1.1 给网络增加短期的记忆能力 1.2 有外部输入的非线性自回归模型 1.3 循环神经网络 2.1 简单循环神经网络 2.1.1 循环神经网络的通用近似定理 2.1.2 图灵完备 3.1 序列到类别 3.2 同步的序列到序列模式 3.3 异步的序列到序列模式 2.Homework 1. 实现SRN &am…

JavaScript <关于逆向RSA非对称加密算法的案例(附原代码)>--案例(五)

前言: 趁热打铁,标记一下RSA的算法逆向...第二篇会有详解(本篇重在过程) 正文: 废话不说,直接分析步骤图: 到了这里,可以看到在登录的时候,需要验证码(本篇不教反验证码) 下面是正题--->逆他的pwd(密码) 总结: 问题:怎么确定一个密文数据是基于什么算法做出来的呢? 答:…

【MYSQL】单表查询

查询语法: select 字段(*表示全字段) from 数据表 【where 条件表达式】 【group by 分组字段【having 分组条件表达式】】 【order by 排序字段【asc | desc】】 例子: 教职工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…

智能优化算法应用:基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.多元宇宙算法4.实验参数设定5.算法结果6.…

匿名内部类 - ( 零基础学java )

Java-匿名内部类 我们先分析匿名内部类的结构,然后逐一解释,最后以下罗列的问题都会在下面的内容中一一得到解答 : 匿名内部类到底是什么? 我们为什么要学习匿名内部类 ? 匿名内部类都有怎样的作用 ? 匿名内部类应用的场景又有哪些 ? 匿名内部类是否有缺陷? 让我们…

基于SSM的教师上课系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

基于以太坊的智能合约开发Solidity(基础篇)

参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili 1、第一个程序——Helloworld: //声明版本号(程序中的版本号要和编译器版本号一致) pragma solidity ^0.5.17; //合约 contract HelloWorld {//合约属性变…

一些AG10K FPGA 调试的建议-Douglas

PLL AGM FPGA 在配置成功时,PLL 已经完成锁定,lock 信号已经变高;如果原设计中用 lock 信号输出实现系统 reset 的复位功能,就不能正确完成上电复位;同时,为了保证 PLL 相移的稳定,我们需要在 P…

项目文章(ChIP-seq)|Plant Physiol组蛋白H3K4甲基转移酶DcATX1促进乙烯诱导康乃馨花瓣衰老

发表单位:华中农业大学 期 刊 :Plant Physiology(IF:7.4) 发表日期:2023年5月2日 2023年5月2日华中农业大学的张帆教授研究团队在期刊Plant Physiology(IF:7.4)发表了题为“Histone H3K…

【软考】信息系统项目管理师论文方向猜想

报喜不报忧,每天都在为鸡零狗碎推诿扯皮,属实是有辱师门。 通过软考,目前算是真正有意义的事情。 虽然都说高项的论文是个玄学,但是道听途说了一些通关感想还是蛮有启发的。 文件要求 参考了一份广西省高级工程师评审的文件&am…

磁学单位SI制和CGS制的转换

电磁学领域中除了使用一般的SI国际制单位外,还会使用CGS高斯制单位,这对于接触磁性材料的朋友们来说,有时就需要做单位的转换,而这两种单位制的转换计算非常复杂。为了方便大家使用,我们系统地总结了一下电磁学中的单位…

python用turtle画樱花飘落,python代码画樱花代码

这篇文章主要介绍了python用turtle画樱花飘落,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 1、python画樱花树代码为: import turtle as T import random import…

洲际酒店集团内外并举 引领行业多元包容文化发展

携手多家本地合作伙伴聚焦女性职业发展和残障群体关爱 2023年12月8日,上海 — 近年来,随着“中国式现代化”进程的不断推进,建立多元、包容的雇佣环境,促进公平就业机会等愈加受到社会各界的重视。洲际酒店集团深知,“…

ssm基于JAVA的网上药品售卖系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本网上药品售卖系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

从零开始搭建企业管理系统(四):集成 Knife4j

集成 Knife4j 前言Knife4j是什么集成 Knife4j引入 pom 依赖添加基础配置启动程序测试完善文档信息编写配置类修改 UserController修改 UserEntity修改 BaseEntity 文档效果图swagger 界面knife4j 界面 前言 前面一小节我们使用postman来进行接口的调试,如果接口一多…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈:大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

Java项目-瑞吉外卖Day3

填充公共字段: 目的:由于某些属性,例如createdTime这些需要填充的字段会在多个地方出现,所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略,是插入/更新的时候…

5个免费AI文案生成器【2024】

随着科技的不断进步,人工智能在各行各业中崭露头角,其中,AI文案生成器的出现在内容创作领域引起了翻天覆地的变化。在这个信息快速传递的时代,如何更高效地进行文案创作成为许多从业者关注的焦点。本文将深入探讨AI文案生成器&…