HarmonyOS实战——CommonDialog组件的基本使用

简介: HarmonyOS实战——CommonDialog组件的基本使用

弹框组件

  • 在HarmonyOS当中,常用的弹框主要有两种:
  1. 第一种是普通弹框(CommonDialog),提示用户并让用户进行对应的操作的,比如使用打车软件的时候,如果手机没有开定位,就会有弹框提示,让你在手机中开启定位,这就是一个普通弹框,给你作为一个信息的提示,并且做一些操作。

在这里插入图片描述
在这里插入图片描述

  1. 第二种消息提示弹框(ToastDialog),如:在每次打开“小破站”APP的时候,都会弹出提示,这些也是弹框。这些弹框不需要用户选择的,只是告诉用户一些消息而已

在这里插入图片描述

1. CommonDialog 组成和使用

  • 在鸿蒙当中,这种普通和弹框其实是有默认布局的
  • 下面的选择按钮最多只有三个

在这里插入图片描述

  • 弹框并不是APP启动时立马弹出来的,一般会有两种情况:
  1. 点击按钮的时候会弹出来
  2. 当程序满足一定要求的时候也会弹出来

项目案例:

  • 新建项目:DialogApplication

ability_main

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Button
        ohos:id="$+id:but1"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="点我"
        ohos:text_size="40vp"
        ohos:background_element="red"/>

</DirectionalLayout>

MainAbilitySlice

package com.xdr630.dialogapplication.slice;

import com.xdr630.dialogapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.window.dialog.CommonDialog;
import ohos.agp.window.dialog.IDialog;

public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        //1.找到按钮
        Button but1 = (Button) findComponentById(ResourceTable.Id_but1);

        //2.给按钮添加点击事件
        but1.setClickedListener(this);

    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    @Override
    public void onClick(Component component) {
        //把普通弹框弹出来就可以了
        //1.创建弹框对象
        // this:当前弹框展示在当前界面中
        CommonDialog cd = new CommonDialog(this);
        //2.因为弹框里面是有默认布局的
        //设置标题
        cd.setTitleText("系统定位服务已关闭");
        //设置内容
        cd.setContentText("请打开定位服务,以便司机师傅能够准确接您上车");
        //设置按钮
        //参数1:按钮的索引 0 1 2
        //参数2:按钮上的文字
        //参数3:点击了按钮之后能做什么
        cd.setButton(0, "设置", new IDialog.ClickedListener() {
            @Override
            public void onClick(IDialog iDialog, int i) {
                //写上点击了之后设置,要做的事情
                //如果点击了之后不需要做任何事情,在第三个参数中传递 null 就可以了

                //因为这里点击了设置还无法跳转到设置定位的那个界面,所以先不写,等以后学习了再补在这里
            }
        });

        //设置取消按钮
        cd.setButton(1,"取消",null);

        //把弹框显示出来
        cd.show();
    }
}
  • 运行:

在这里插入图片描述

  • 点击后:

在这里插入图片描述

  • 当再次点击灰色区域也没有反应
  • 点击或 取消 按钮时没有任何反应,因为在上面的那里设置了 null

一般点击弹框的两种情况:

  1. 点击灰色区域也不能取消,必须点击取消按钮才能取消弹框
  2. 点击灰色区域或取消按钮都能达到取消弹框的效果

下面就实现上面这两种情况:

  1. 点击灰色区域也能取消按钮的情况,在上面的代码基础上补充如下

在这里插入图片描述

  1. 当鼠标点击取消按钮的时候也能让弹框消失,把上面设置取消按钮的 null 设置为:

在这里插入图片描述

  • 运行,点击后:

请添加图片描述

  • 实现了上面的两种情况

2. CommonDialog 自定义布局使用

  • CommonDialog 里面有默认的布局,布局由如下三部分组成:

在这里插入图片描述

  • 所以只要直接调用方法给里面设置一些文本内容就可以了
  • 下面就介绍下自定义弹框里的内容

案例如下:在主界面上有一个按钮,点击了一个按钮后会出现弹框
在这里插入图片描述

  • 弹框里面有三个东西:一行文本和两个按钮

在这里插入图片描述

  • 当点击了 确定 按钮后,上面的文本就会变成“点击了确定按钮”,当点击了 取消 按钮后弹框就会消失

在这里插入图片描述

下面就实现下:

  • 新建项目:DialogLayoutApplication

ability_main

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <Button
        ohos:id="$+id:but"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="点我"
        ohos:text_size="40fp"
        ohos:background_element="red"/>


</DirectionalLayout>
  • 弹框里面的内容也可以用 xml 来写,新建一个布局文件

在这里插入图片描述

  • 文件名不能是大写的

在这里插入图片描述

  • 上面的弹框组成:一个Text文本+两个Button
  • 生成弹框的布局文件后,首先改下布局文件的大小,默认的就是充满整个屏幕的,改为包裹内容的就行了

在这里插入图片描述

  • 文本的内容因为是变化的,所以在java代码那里进行设置

在这里插入图片描述

  • 两个按钮如果不设置外边距的话就会挤在一起,所以要加个上往外边距

在这里插入图片描述

messagedialog

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_content"
    ohos:width="match_content"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:message"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text_size="40fp"/>
    
    <Button
        ohos:id="$+id:submit"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="确定"
        ohos:text_size="40fp"
        ohos:background_element="red"/>

    <Button
        ohos:id="$+id:cancel"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:text="取消"
        ohos:text_size="40fp"
        ohos:background_element="blue"
        ohos:top_margin="10vp"
        />


</DirectionalLayout>

MainAbilitySlice

package com.xdr630.dialoglayoutapplication.slice;

import com.xdr630.dialoglayoutapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
import ohos.agp.window.dialog.CommonDialog;

public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        //1.找到布局中的按钮
        Button but = (Button) findComponentById(ResourceTable.Id_but);

        //2.添加一个点击事件
        but.setClickedListener(this);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    @Override
    public void onClick(Component component) {
        //把弹框展示出来
        //创建一个弹框对象
        CommonDialog cd = new CommonDialog(this);
        //大小是默认包裹内容的
        //弹框默认是居中设置的
        //弹框默认是透明的
        //弹框默认是直角的,可以把直角设置为圆角
        cd.setCornerRadius(15);


        //把 messagedialog 的 xml 文件加载到内存当中,交给弹框并且展示出来

        //加载 xml 文件并获得一个布局对象
        //parse方法:加载一个 xml 文件,返回一个布局对象
        //参数一:要加载的 xml 文件
        //参数二:该 xml 文件是否跟其他 xml 文件有关。如果无关是独立的,就写 null 就行了
        //参数三:如果文件是独立的,那么直接写 false
        DirectionalLayout dl = (DirectionalLayout) LayoutScatter.getInstance(this).parse(ResourceTable.Layout_messagedialog, null, false);

        //要给布局里的文本和按钮设置事件或者修改内容
        //此时需要用 dl 去调用,表示获取的是 dl 这个布局里面的组件
        Text title = (Text) dl.findComponentById(ResourceTable.Id_message);
        Button submit = (Button) dl.findComponentById(ResourceTable.Id_submit);
        Button cancel = (Button) dl.findComponentById(ResourceTable.Id_cancel);

        //给title标题设置内容
        title.setText("请选择下面的按钮并点击");

        //还需要给两个按钮添加单击事件
        submit.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                title.setText("点击了确定按钮");
            }
        });

        //取消按钮也要添加点击事件
        cancel.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                //当点击取消按钮之后,把弹框关闭
                cd.destroy();
            }
        });

        //此时布局对象和弹框还没有任何关系
        //还需要把布局对象交给弹框
        cd.setContentCustomComponent(dl);

        //让弹框展示出来
        cd.show();

    }
}
  • 运行:

在这里插入图片描述

  • 点击后,就会弹出弹框

在这里插入图片描述

  • 点击弹框中的确定按钮后,文本内容发生改变

在这里插入图片描述

  • 点击取消按钮后,弹框消失,恢复到原界面

在这里插入图片描述

3. 优化代码——抽取弹框工具类

  • 在工作当中,如果需要用多个弹框,而每次都和上面一样写的话,就会造成代码冗余,不方便管理
  • 下面就把弹框抽取成一个工具类,当用到一个弹框的时候,直接调用工具类中的方法就可以了
  • 创建一个工具类

在这里插入图片描述

  • 创建一个弹框的工具类:MyDialog

在这里插入图片描述

  • 当外界调用了这个方法之后,就会出现一个弹框

在这里插入图片描述

  • 把上面的 OnClick 方法中的代码剪切到上面的 showDialog 方法中

在这里插入图片描述

  • 粘贴过来后,MyDialog类中部分代码修改如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • MainAbilitySlice类中修改如下,直接调用MyDialog中的方法,传递参数就行了

在这里插入图片描述

  • 运行:

在这里插入图片描述

  • 点击确定按钮后,发现Text文本内容是刚刚方法中传递过来

在这里插入图片描述

目录
相关文章
|
4天前
|
JavaScript API 数据处理
基于HarmonyOS 5.0 (Next)技术的渐变模糊效果技术实现【代码实战】
本文详细介绍如何在HarmonyOS 5.0(Next)中实现渐变模糊效果,涵盖从基础页面搭建到添加模糊、渐变效果的全过程,并通过代码实战展示具体操作步骤。文章首先介绍了使用`Stack`和`Image`控件设置背景并应用`foregroundBlurStyle`属性实现模糊效果,接着通过`linearGradient`属性融入渐变效果,使界面更加精致美观。此外,还展示了如何利用滑动条和手势等交互元素动态调整模糊与渐变效果,增强用户体验。最后,通过具体代码示例说明如何为图片、弹窗等控件添加渐变模糊效果,突显HarmonyOS的强大功能与灵活性。
30 17
|
4天前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
121 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
5天前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
93 38
|
4天前
|
开发框架 人工智能 安全
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
HarmonyOS NEXT的发布对华为及整个行业都产生了深远的影响。它不仅展示了华为的技术实力,还敏锐地把握了市场需求。同时,吸引了更多的开发者和合作伙伴加入鸿蒙生态体系,共同推动鸿蒙生态的繁荣发展。
175 20
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
|
3天前
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
39 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
|
5天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
149 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
3天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
36 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
2天前
|
JavaScript Java 容器
鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach
导读:在本篇文章里,您将掌握层叠布局、自定义组件的用法,特别是自定义组件将来的开发中必然会用,其中应该特别关注自定义组件的一些规范与装饰器。
25 7
鸿蒙应用开发从入门到入行 - 篇4:层叠布局、自定义组件、ForEach
|
1天前
鸿蒙开发:一个轻盈的上拉下拉刷新组件
在和可滑动组件使用的时候,记得一定要和nestedScroll属性配合使用,用于解决滑动冲突,除此之外,还需要传递滑动组件的scroller属性,用于手势操作。
鸿蒙开发:一个轻盈的上拉下拉刷新组件
|
3天前
|
人工智能 安全 数据安全/隐私保护
HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS实现的开箱即用登录页面。HarmonyOS 5.0是华为于2024年10月22日发布的第三代移动操作系统,具备原生智能、互联、安全及流畅特性。文章详细解析了使用ArkTS开发登录页面的代码,涵盖组件定义、界面布局、事件处理、样式设置及异步操作等内容,展示了清晰的组件结构、响应式设计与模块化编程的优势。通过这段代码,开发者可以快速上手并构建高效、美观的应用界面。

热门文章

最新文章