Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析

目录

在这里插入图片描述


一、Dialog和DialogFragment的区别

Android在DialogFragment推出后,就已经不推荐继续使用Dialog,可替换为DialogFragment:

  1. 更好的生命周期管理:DialogFragment能够自动处理Activity的生命周期事件,确保对话框在Activity重建时能够正确恢复。在Activity退出的时候会自动回收Dialog弹窗。
  2. 更高的灵活性:DialogFragment支持复杂的UI和逻辑操作,能够满足更多样化的需求。
  3. 更好的封装性:通过封装对话框的显示逻辑,DialogFragment提高了代码的可重用性和可维护性。
  4. 更好的用户体验:由于DialogFragment能够更好地处理配置更改,因此能够提供更稳定、更流畅的用户体验。

二、Dialog如何使用?

(1)如下是一个最简单的使用方法:

Dialog(this@SettingActivity).show()

(2)当然,我们不可能这样使用,而是会增加布局视图、动画:

<!-- res/layout/dialog_custom.xml -->  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:orientation="vertical"  android:padding="16dp">  <TextView  android:id="@+id/textViewMessage"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="这是一个自定义对话框"  android:textSize="18sp" />  <Button  android:id="@+id/buttonOk"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="确定" />  </LinearLayout>
// 假设这是Activity中的一个方法  
fun showCustomDialog() {  // 创建一个Dialog实例  val dialog = Dialog(this)  // 去除Dialog的标题  dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)  // 设置Dialog的内容布局  dialog.setContentView(R.layout.dialog_custom)  // 设置Dialog的窗口动画(需要先在res/values/styles.xml中定义动画样式)  //dialog.window?.setWindowAnimations(R.style.DialogAnimation)  // 获取布局中的组件并设置事件监听器  val textViewMessage = dialog.findViewById<TextView>(R.id.textViewMessage)  val buttonOk = dialog.findViewById<Button>(R.id.buttonOk)  // 设置按钮的点击事件监听器  buttonOk.setOnClickListener {  // 关闭Dialog  dialog.dismiss()  }  // 显示Dialog  dialog.show()  
}

(3)那么如何继承dialog来自定一个dialog呢?

import android.app.Dialog  
import android.content.Context  
import android.os.Bundle  
import android.view.LayoutInflater  
import android.view.View  
import android.view.Window  
import android.widget.Button  
import android.widget.TextView  // 自定义Dialog类  
class CustomDialog(context: Context) : Dialog(context) {  // 布局中的组件  private lateinit var textViewMessage: TextView  private lateinit var buttonOk: Button  //Dialog的初始化其实就是让我们去初始化自己的视图override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  // 去除标题  requestWindowFeature(Window.FEATURE_NO_TITLE)  // 设置内容布局  setContentView(R.layout.dialog_custom)  // 初始化布局中的组件  textViewMessage = findViewById(R.id.textViewMessage)  buttonOk = findViewById(R.id.buttonOk)  // 设置按钮的点击事件监听器  buttonOk.setOnClickListener {  // 关闭Dialog  dismiss()  }  // (可选)设置Dialog的窗口动画  // window?.setWindowAnimations(R.style.DialogAnimation)  }  // 你可以添加更多的方法和属性来扩展你的Dialog  // 例如,一个方法来设置消息文本  fun setMessage(message: String) {  textViewMessage.text = message  }  
}  // 在你的Activity或Fragment中这样使用它  
fun showCustomDialog(context: Context) {  val customDialog = CustomDialog(context)  // (可选)设置消息文本  customDialog.setMessage("这是一个自定义对话框")  // 显示Dialog  customDialog.show()  
}

这个CustomDialog类直接继承了Dialog,并在其onCreate方法中设置了布局、初始化了组件,并设置了监听器。show()其实就是走Dialog的生命周期,然后做初始化工作,注意,show()之后才执行onCreate()。如下源码可以看出:

在这里插入图片描述

在这里插入图片描述


三、Dialog是什么,Window又是什么?

我们可以看一下Dialog的源码。

在这里插入图片描述

Dialog的构造方法中可以看出,Dialog实质上是个Window。

Dialog是Android中用于显示一个浮动窗口的类,这个窗口会覆盖在当前的活动(Activity)或应用程序的顶部。Dialog用于临时显示一些信息给用户,或者要求用户进行某些选择(如确认、选择列表项等)。Dialog可以包含各种控件,如按钮、文本输入框、列表视图等,以便与用户进行交互。

那么Window是什么?

Window是Android中更为抽象的一个概念,它代表了屏幕上的一块矩形区域,用于显示内容。在Android中,几乎所有的UI组件都是基于Window的,包括Activity、Dialog等。Activity实际上是一个特殊的Window,它拥有整个屏幕作为显示区域,并且可以在其上添加各种视图(Views)来构建用户界面。

Dialog与Window的区别:

Dialog与Window:Dialog内部通过PhoneWindow来实现窗口的显示,PhoneWindow是Window的具体实现类。Dialog在创建时会关联一个PhoneWindow对象,并通过这个对象来管理窗口的视图和布局。

WindowManager 是什么?

还有一个WindowManager,WindowManager负责将应用的用户界面显示在屏幕上,并管理窗口的创建、显示、隐藏、更新等操作。Dialog在创建时会关联一个Context(上下文),并通过这个Context获取WindowManager服务,进而与WindowManager绑定,实现窗口的添加和管理。


四、DialogFragment是什么?

DialogFragment 本质上是一个Fragment + Dialog,也就具有Fragment所拥有的生命周期,同时拥有Dialog的特点;在使用时,更容易通过生命周期回调来管理弹窗,对于复杂样式的弹窗,使用DialogFragment更加方便和高效。


五、DialogFragment如何使用

(1)创建xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="880dp"android:layout_height="420dp"android:layout_gravity="center"android:background="@drawable/home_rectangle_background"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><TextViewandroid:id="@+id/home_textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="120dp"android:text="是否立即关机?"android:textColor="#576478"android:textSize="42sp"android:textStyle="bold"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_start_dev"android:layout_width="260dp"android:layout_height="100dp"android:gravity="center"android:text="立即开机"android:layout_marginTop="70dp"android:textSize="42sp"android:textColor="@color/white"android:background="@drawable/home_rectangle_blue_background"app:layout_constraintEnd_toStartOf="@+id/backstage_guideline"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/home_textview" /><TextViewandroid:id="@+id/tv_back"android:layout_width="260dp"android:layout_height="100dp"android:layout_marginTop="70dp"android:gravity="center"android:textColor="#569DF6"android:text="取消"android:textSize="42sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="@+id/backstage_guideline"app:layout_constraintTop_toBottomOf="@+id/home_textview" /><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/backstage_guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"app:layout_constraintGuide_percent="0.5" /></androidx.constraintlayout.widget.ConstraintLayout></androidx.constraintlayout.widget.ConstraintLayout>

(2)创建一个类继承自DialogFragment,然后给他指定布局文件
在 onCreateView() 方法中,加载弹窗的布局文件。
在 onViewCreated() 方法中,初始化弹窗的控件。

class MyDialogFragment: DialogFragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE)var view :View = inflater.inflate(R.layout.backstage_dialog_devonoff,container)return view}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)var tv :TextView= view.findViewById(R.id.tv_start_dev)}
}

(3)在Activity中进行使用。

 val myDialogFragment: MyDialogFragment= MyDialogFragment()myDialogFragment.show(supportFragmentManager, "MyDialogFragment")

在这里插入图片描述


六、DialogFragment源码解析

DialogFragment创建的时候,会有两个创建方法:onCreateDialog和onCreateView

class MyDialogFragment:DialogFragment() {override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {return super.onCreateDialog(savedInstanceState)}override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return super.onCreateView(inflater, container, savedInstanceState)}
}

如果你在onCreateDialog和onCreateView都写了布局,那么会优先使用onCreateDialog里面的。源码这里我们可以看到。如果onCreateDialog不传递一个新的dialog,那么就会使用默认的,而布局,就是从onCreateView里面取,也就是requireView方法。
在这里插入图片描述在这里插入图片描述

如果onCreateDialog不重写,会自动创建一个空白的dialog。view使用的就是oncreateView的:如下:

在这里插入图片描述

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

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

相关文章

Git 撤回commit

上一篇&#xff0c;Git撤销add&#xff0c;其实已经讲了用reset命令可以取消commit&#xff0c;这里再啰嗦下。先看&#xff1a; git如何撤回已经commit • Worktile社区 首先明确一点&#xff0c;无论是commit还是撤销commit&#xff0c;都是在本地暂存区操作&#xff0c;而…

如何测试一个算法

目录 1.从参数上进行设计 2.从代码逻辑上进行设计 3.从代码性能上进行设计 4.考虑异常情况 5.总结 下面是冒泡排序的代码&#xff0c;我们如何针对这个代价进行测试? public void BubbleSort(int[] arr) {for (int i 0; i < arr.length; i) {for (int j 0; j < a…

CleanMyMac X2024最新官方中文破解版本下载

&#x1f9f9; 嘿&#xff0c;Mac用户们&#xff0c;你们的小助手来了&#xff01; 今天要跟大家分享的&#xff0c;是一个能让你们的电脑焕发新生的神器——CleanMyMac X。这可不是一般的清洁工&#xff0c;它可是拥有超能力的超级英雄哦&#xff01;&#x1f31f; CleanMyMa…

第 1 章:原生 AJAX

原生AJAX 1. AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一…

文章如何进行谷歌SEO优化?

内容绝对是谷歌seo最花时间以及成本&#xff0c;内容基本决定一个网站的生死&#xff0c;所以文章绝对要重视&#xff0c;而想写好一篇适用于谷歌seo的文章&#xff0c;首要保证的是内容的质量和原创性&#xff0c;这是SEO的核心&#xff0c;对于一篇seo文章来说&#xff0c;关…

MySQL-进阶篇-锁(全局锁、表级锁、行级锁)

文章目录 1. 锁概述2. 全局锁2.1 介绍2.2 数据备份2.3 使用全局锁造成的问题 3. 表级锁3.1 表锁3.1.1 语法3.1.2 读锁3.1.3 写锁3.1.4 读锁和写锁的区别 3.2 元数据锁&#xff08;Meta Data Lock&#xff0c;MDL&#xff09;3.3 意向锁3.3.1 案例引入3.3.2 意向锁的分类 4. 行级…

Java项目:140 springboot203医疗挂号管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 一共有管理员、挂号人员、划价人员、医生 四个角色 管理员登录进入本系统操作的功能包括对挂号人员&#xff0c;划价人员&#xff0c;患者&#xff0…

828华为云征文|华为云Flexus X实例MySQL性能加速评测及对比

目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 购买MySQL加速镜像 2.3 重置密码 2.4 登录服务器 三、Flexus X实例加速MySQL测试 3.1 sysbe…

深入Linux轻量级进程管理:线程创建、线程ID解析与进程地址空间页表探究

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f6b2;Linux线程控制&#x1f40f;POSIX线程库&#x1f415;创建线程&#x1f41f;指令查看轻量级进程指令&#xff1a;ps -a…

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…

Denodo 连续 4 年获评 Gartner® 数据集成工具魔力象限™ 领导者

Gartner 在其 2023 年数据集成工具魔力象限中连续第四年将 Denodo 评为“领导者”。 Gartner 表示&#xff1a;“由于对数据编织架构、数据产品交付以及支持生成式 AI 的集成数据的需求即将到来&#xff0c;数据集成工具市场正在蓬勃发展。数据和分析领导者应该利用这项研究来…

RabbitMQ 基础架构流程 数据隔离 创建用户

介绍 publisher&#xff1a;消息发送者-exchange&#xff1a;交换机&#xff0c;复制路由的消息-queue&#xff1a;队列&#xff0c;存储消息consumer&#xff1a;消息的消费者 工作流程 publisher消息发送者 -> exchange 交换机 -> queue 队列 -> consumer 消息的消…

基于STM32的多功能车位锁设计

本设计基于STM32的多功能车位锁&#xff0c;该系统主要包括&#xff1a;测距模块、光强采集模块、主控芯片模块、显示模块、摄像模组等。系统以STM32单片机作为主控芯片用来对系统中的外设进行控制并且对传输过来的数据进行处理。通过K210模块来实现图像识别的功能检测车牌是否…

加码产品创新、革新搜索体验 夸克登顶“AI产品榜”月榜

随着人工智能应用到生活中的方方面面&#xff0c;AI生产力工具实现了快速爆发。日前&#xff0c;AI新榜发布8月“AI产品榜”&#xff0c;阿里巴巴旗下夸克凭借一系列产品创新和大模型能力跃升占据首位。在升级App端“超级搜索框”、推出PC端“系统级全场景AI”后&#xff0c;夸…

三文带你轻松上手鸿蒙的AI语音01-实时语音识别

三文带你轻松上手鸿蒙的AI语音01-实时语音识别 前言 HarmonyOSNext中集成了强大的AI功能。Core Speech Kit&#xff08;基础语音服务&#xff09;是它提供的众多AI功能中的一种。 Core Speech Kit&#xff08;基础语音服务&#xff09;集成了语音类基础AI能力&#xff0c;包…

Redis - 主从复制

文章目录 目录 文章目录 前言 1. 配置 建立复制 断开复制 传输延时 2. 主从拓扑结构 一主一从 一主多从 树状 三. 原理 数据同步 psync replicationid/replid(复制id) master_replid 和 master_replid2 offset (偏移量) psync 运行流程 全量复制 部分复制 …

echarts多个环形图

echarts图表集 var dataValue [{name:今日待分配方量,value:49}, {name:今日已分配方量,value:602}, {name:今日完成方量,value:1037}]var piedata1 [{name: 1#拌和机,value: 20},{name: 2#拌和机,value: 22},{name: 3#拌和机 ,value: 17},{name: 4#拌和机,value: 18},{name…

基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

【JAVA基础】StringUtils.isEmpty、StringUtils.isBlank()、Objects.isNull()三者区别

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;日常经验 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 总是区分不清楚这几个的差别&#xff1a;我们来直接验证一下&#…

活动系统开发之采用设计模式与非设计模式的区别-数据库设计及代码设计

1、数据库ER图 2、应用框架选用 PHP语言对应的thinkphp6.1应用框架 3、功能代码设计(后端) a、父类Base.php i&#xff1a;控制登录&#xff0c;只能登录后管理员才能操作&#xff1b; ii&#xff1a;控制按钮权限&#xff0c;管理员不仅要登录&#xff0c;且必须要有对应菜单…