深入分析Android中Dialog

article/2025/8/27 19:33:57

Android,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识. 



从这张图中可以看到,Dialog为父类其下有最重要的, 我们最常用的AlertDilog, AlertDialog的子类,则是由DatePicker, ProgressDialog,TimePick来组成
这几个子类都是我们在程序开发中最常用的,因此要重点理解我们可以试着想像一下,如下几个问题的答案 
<1> 怎么产生一个Dialog? 
<2> DialogActivity是什么关系为什么显示Dialog的时候,Activity就失去了焦点,不能被点击,在系统内部到底是怎么管理他们的关系的 

我们以ProgressDialog为例通过分析其源码,让我们彻底理解它的内部运行机制 

<1> 怎么产生一个ProgressDialog? 
    通过打开ProgressDialog的源码, 可以看到它有2个构造方法
     ProgressDialog(Context context) 
     ProgressDialog(Context context,int theme) 
    参数解释: context:说明它是依靠Context,必须通过一个Context来创建它第二个  

     参数theme: dialog的主题
另外我们还可以发现  有四个静态的show方法,他们只是参数不同
     show(Context context,CharSequence title,CharSequence message); 
     show(Context context,CharSequence title,CharSequence message,boolean  

      indeterminate); 
其时,我们只看最后一个静态方法就行了,因为三个静态方法,最终会调用最后一个参数最多的show静态方法来完成功能
它所实现的功能是
     ProgressDialog dialog=new ProgressDiaog(context); 
     ... 
     dialog.show(); 
这其实跟,我们调用构造方法是一样的
到这一步,仅仅是知道了,怎么调用产生的ProgressDialog的,但具体内部的细节呢。还要看onCreate()方法此方法才是真正能产生progressDialogr 地方它跟Activity中的onCreate()方法是一样的,就是初始化的时候调用我们看其源码如下
首先看到的是一个名叫 mViewUpdatehandler的 Handler, 这个Handler主要用来更新progress的值, (百分比),接着往下看... 
有这么一句: View view=inflater.inflate(R.layout.alert_dialog_press,null); 
很明显,这就是我们看到的,显示在dialog中转圈的那个东东然而,这个alert_dialog_pross文件是在com.android.internal.R 包中,属于系统定义的ui配置文
最后调用 setView(view)方法来来把view显示在Dialog上。 
因此,我们同样也可以实现自定义一个dialog.xml文件,来调用setView()方法显示上来
这个setView()方法是AlertDialog类中定义的,等会再解释
这就是我们平时所见到的 ProgressDialog。分析完毕。 
AlertDialog 
接下来,我们开始分析ProgressDialog的父类  AlertDialog. 
打开源码,首先映入眼帘的是 三个构造方法,但这三个构造方法都是protected类型的,
可见,不允许我们直接实例化AlertDialog. 因此,我们再看别的有没有方法.可以实例化
再仔细一看,发现一个变量 
   AlertController mAlert; 这个才是我们今天的主角,重点研究它
   mAlert的定义是在 ,以上我们提到的AlertDialog的构造函数
此外,我们还发现,AlertDialog中几乎所有的方法都是通过这个mAlert变量来操作的
也就是说,AlertDialog是一个空壳,并没有实际的作用它的实质是AlertController
就是我刚才说的  "主角。 而Alertcontroller的源码,是Android系统自带的,我们需要花费一番力气去查找
在往下看,AlertDialog 类中,发现一个静态类 Builder,  通过这个类,我们也可以直接创建一个Dialog, 
Builder静态类中也同样有一个AlertController.Alertparams的类的对象 P,我们再看Builder的源码,它里面可以设置所有Dialog的的方法,包括 
setTitle(CharSequence title) 
setMessage(int messageId); 
setIcon(int iconId); 
setPositiveButton() 
等,我们看这些方法的的内部实现,全部是针对它的内置对象来实现的也就是我们所调用的这些方法,最终结果实际上是用在了AlertController.AlertParams 类的对象身上而别外还有一个有趣的现象,这些方法的返回值都是Builder对象也就是说,我们可以连级调用此方法而显示一个Dialog,仅仅调用这些set 方法,还不够,最后还差一步就是调用create()方法,这个方法是最后调用的,也就是创建对话框我们看,create方法中都做了那些动作 

public AlertDialog create() { final AlertDialog dialog =new AlertDialog(p.mContext); p.apply(dialog.mAlert) dialog.setCancelable(P.mCancelable);    return dialog; 
} 
这个是 create() 的实现,我们可以很直观地看出是它帮我们创建了一个 AlertDialog 对象
这里的 p,  就是我们创建的 AlertController.Alertparams 的对象
而在 AlertDialog  dialog=new AlertDialog(p.mContext);  这句代码中,定义 Dialog 的同时也定义了 一个 AlertController  的对象  mAlert; 
在第二句代码中 ,p.apply(dialog.mAlert) , 我们跟踪过去 , 看下,哈哈,原来是,我们刚才调用的 set 方法的值,又还原给新定义的 dialog 中的   mAlert 对象了,  这下明白了,原来  P 只不过是一个  " "   , 暂时的存放数据的对象,只要我们调用 create 方法 ,P 就会乖乖的把数据交给 dialog 对象
除了 create 方法以外 还有一个 show()  方法 , 实现如下 
public AlertDialog show() { AlertDialog dialog=create(); dialog.show(); return dialog; 
我们可以看出, show()  也是调用的  create 方法
由以下的分析,我们就可能轻松理解,如下我们常用的语句了
return new AlertDialog.Builder(context). setIcon(R.drawable.alert_icon). setTitle(R.string.alert_str) .create() ; 


这是我们平时用到的产生 Dialog  .

http://chatgpt.dhexx.cn/article/IIpyhqyv.shtml

相关文章

android自定义dialog去除title,Android 自定义Dialog去除title导航栏的解决方法

Android 自定义Dialog去除title导航栏的解决方法 如下所示: Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); 以上这篇Android 自定义Dialog去除title导航栏的解决方法就是小编分享给大家的全部内…

android常见的dialog的使用及认识

介绍 在实际开发过程中 , 我们难免要经常使用提示框 (dialog), 根据不同的场景使用不同的样式的提示框(dialog). androd提供了丰富的dialog函数 , 本文将介绍在实际开发中经常使用的对话框, 包括普通对话框 , 列表对话框 , 单选对话框 , 多选对话框 , 等待对话框, 进度条对话框…

ABAP屏幕设计Dialog

目录 一、概览 1.屏幕 2.程序组织 3.屏幕定义和维护 用途&#xff1a; 组成&#xff1a; Dialog的屏幕执行过程&#xff1a; 属性&#xff1a; 创建&#xff1a; 4.屏幕属性的动态修改 5.屏幕序列 二、Screen编程实例 1.Hello World屏幕编程 建立程序&#xff1a; 设计…

Android Dialog 源码研究

Android Dialog 源码研究 在阅读Dialog源代码之前,我给自己提出了4个问题,带着这4个问题的疑问,我才开始看源码,这样的好处能让阅读中有了侧重点,往往能更快的理解某些代码的意图,这也正是为什么总说提出问题本身,要比解决问题困难。 我下面要思考的4个问题是: Dialo…

android 判断dialog,Android 7.0经验谈:Dialog不显示之迷

最近遇到个怪问题,在其他手机上都能正常的显示Dialog,但是在Android 7.0的手机上只能显示Dialog的半透明背景,无法显示Dialog的内容。 用图给大家展示一个遇到的现象,正常时应该是这个样子的: 而我们遇到的情况如下,更坏的是如果我们设置Dialog不能点击空白处取消(dismis…

Android窗口设计之Dialog、PopupWindow、系统窗口的实现

窗口设计之Dialog、PopupWindow、系统窗口的实现 Android应用程序窗口设计系列博客: Android应用程序窗口设计之Window及WindowManager的创建 Android应用程序窗口设计之setContentView布局加载的实现 普法Android的Token前世今生以及在APP,AMS,WMS之间传递 Android应用程序窗口…

理解Android中Dialog

文章收藏的好句子&#xff1a;你能走多远、爬多高&#xff0c;不仅取决于你自身的力量&#xff0c;还取决于周围人带动的力量。 PS&#xff1a;本文是基于 Android Api 26 来分析源码的。 1、Dialog 的 Window 是在哪里创建的&#xff1f; Dialog 的 Window 是在什么地方创建的…

Android之Dialog分析

Android之Dialog分析 以Dialog为引导&#xff0c;Android的弹出式消息一共是三种&#xff08;据我所知&#xff09;&#xff1a;Dialog&#xff0c;tocast&#xff0c;notification 其三种弹出式消息各有所长。今天重点是分析其中的Dialog。Android的Dialog是android界面编程的…

Android开发dialog内存泄露,Dialog引发的内存泄漏

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文是本人对于 LeakCanary 团队的一篇分析内存泄漏的文章的意译。水平有限,如有不够准确之处,敬请包涵。 主旨:在Lollipop之前的版本,Dialog可能导致内存泄漏。 引言 LeakCanary 提示存在内…

android源码分析-Dialog

今天给大家介绍android -Dialog源码分析 Dialog 是所有对话框的基类&#xff0c;例如AlertDialog&#xff0c;我们要深入了解指导Dialog的用法&#xff0c;逻辑&#xff0c;必须要把Dilaog弄清楚&#xff0c;下面首先我们来看下Google对Dialog的类描述&#xff1a;/**Base clas…

Dialog源码分析

1, 概述 Dialog(对话框)不仅可以显示信息,还可以和Activity界面进行交互,这种交互是阻塞式的. 继承Dialog的类有好几种,主要以AlertDialog为例来分析一下具体的原理。 2 实现 Dialog依附于Activity来实现,一般在acitivty中显示,因为Dialog的交互是阻塞式的,所以最好另开一线…

爬虫为什么会使用到HTTP代理?

在进行网页爬虫的时候使用HTTP代理&#xff0c;可以进行匿名抓取网页信息&#xff0c;爬取大数据等使用方向。HTTP代理我们很了解&#xff0c;但是你有了解过HTTP协议是什么吗&#xff1f; HTTP协议即超文本传输协议&#xff0c;是Internet上信息传输时使用最为广泛的一种简单…

爬虫笔记——全局代理下的requests写法

当PC挂了全局代理的时候&#xff0c;如果你的requests还像下面写的话&#xff0c;大概率会报错&#xff1a; 正确的写法是&#xff1a;

抓包:Android不走代理的请求

测试用例 测试应用有两个按钮&#xff0c;分别用 HttpURLConnection 和 Okhttp3 请求 https://www.baidu.com/。注意&#xff1a;两个请求都加入了 Proxy.NO_PROXY。 //HttpURLConnection请求https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel13812371237 public …

python爬虫——selenium+chrome使用代理

先看下本文中的知识点&#xff1a; python selenium库安装chrome webdirver的下载安装seleniumchrome使用代理进阶学习 搭建开发环境&#xff1a; selenium库chrome webdirver谷歌浏览器 >7.9 PS&#xff1a;安装了的同学可以跳过了接着下一步&#xff0c;没安装的同学跟…

python 爬虫 客户端_python爬虫

爬虫简介 什么是爬虫&#xff1f; 爬虫&#xff1a;就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol&#xff0c;超文本传输协议)&#xff1a;是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单…

爬虫从入门到精通(7) | 常见反爬-代理IP的使用

目录 一、 为什么要使用代理IP&#xff1f; 二、代理IP的原理 三、代理IP的作用 四、代理IP的分类 ​ 1.根据代理的协议区分 2.根据匿名程度区分 五、在requests模块中如何设置代理 一、 为什么要使用代理IP&#xff1f; 使用自己本地的IP 利用爬虫技术获取某个网站信息的时…

爬虫手册06 代理池和代理服务器搭建

免费代理池的搭建 参考资料&#xff1a;Python3 网络爬虫开发实战&#xff08;第二版&#xff09; 一. 学习目标 &#xff1a; 参考《第9章 代理的使用》9.2节搭建自己私有的代理IP池。 二. 实验环境&#xff1a; 阿里云或腾讯云的服务器&#xff0c;我是在打折和新用户优…

我裂开了,教给他如何搭建和使用代理服务器,他居然用来做这么不正经的事(爬虫,代理ip)

代码是正经代码&#xff0c;但是程序员正不正经就不知道了。 ​ 前言 在使用爬虫对某些网站进行爬取时&#xff0c;为了不让网站发现我们的ip&#xff0c;模拟其他用户ip地址去访问网站。也就相当于间接的去访问网站&#xff0c;流程如图&#xff1a; 我们使用到代理服务器&…

Python爬虫进阶 - win和linux下selenium使用代理

目录 Windows selenium配置 下载地址 Chrome Chromedriver 版本对应关系 实践测试 操作元素 浏览器操作 获取元素信息 鼠标操作 实战demo selenium添加代理 Linux selenium配置 检查服务器环境 下载安装第三方库&#xff08;最简单版&#xff09; 实践测试 代码…