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

从这张图中可以看到,Dialog为父类, 其下有最重要的, 我们最常用的AlertDilog, 而AlertDialog的子类,则是由DatPicker, ProgressDialog,TimePick来组成.
这几个子类都是我们在程序开发中最常用的,因此要重点理解, 我们可以试着想像一下,如下几个问题的答案
<1> 怎么产生一个Dialog?
<2> Dialog与Activity是什么关系? 为什么显示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()
...
...
....
等,我们看这些方法的的内部实现,全部是针对它的内置对象P 来实现的, 也就是我们所调用的这些方法,最终结果实际上是用在了AlertController.AlertParams 类的对象P 身上,
,而别外还有一个有趣的现象,这些方法的返回值都是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
Android中Dialog的更多相关文章
- Android中Dialog的使用
上一篇博文讲到对话框popWindow的使用,这篇博文主要解说Dialog的使用. 1.什么是Dialog? Dialog就是对话框的一种方式! 在Android开发中.我们常常会须要在Android ...
- Android中Dialog对话框的调用及监听
Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter, ...
- Android 中Dialog的使用
本文是参考ProAndroid的第10章Working with Dialogs的内容,在合适的地方添加了作者自己的一些见解最终成文. Android 中的对话框是一个展示在当前窗口上的小一号的窗口, ...
- Android中Dialog对话框
布局文件xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- 我的Android进阶之旅------>Android中Dialog系统样式讲解
今天在维护公司的一个APP的时候,有如下场景. 弹出一个AlertDialog的时候,在系统语言是中文的时候,如下所示: 弹出一个AlertDialog的时候,在系统语言是English的时候,如下所 ...
- android从Dialog对话框中取得文本文字
android中Dialog对话框获取文本文字,只需要使用editor的getText方法就可以获得,示例如下:final EditText et = new EditText(this); et.s ...
- Android 自定义Dialog类,并在Activity中实现按钮监听。
实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的 ...
- Android中制作自定义dialog对话框的实例
http://www.jb51.net/article/83319.htm 这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...
- 详细解读Android中的搜索框(二)—— Search Dialog
Search Dialog是提供搜索的控件之一,还有一个是上次小例子给出的searchView,关于SearchView的东西后面会说到.本次先从Search Dialog说起,让大家慢慢理解andr ...
随机推荐
- 深入浅出JSON
JSON定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成.它基于ECMA262语言规范(1999 ...
- 初学require.js
引入require.js,可以解决的问题: (1)实现js文件的异步加载,避免网页失去响应: (2)管理模板之间的依赖性,便于代码的编写和维护. 它的模块管理遵循AMD规范(Asynchronous ...
- unity3d 参考坐标系
原地址:http://www.cnblogs.com/88999660/archive/2013/04/01/2993844.html 参考坐标系(Reference Coordinate Syste ...
- xcode6 使用MJRefresh
1. MJRefreshConst.m 里面 会报错: unknown type 'NSString'... 原因: xcode6 取消.pch文件, 所以没有导入 foundation和uikit ...
- iso socket基础2
iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...
- 压缩 javascript 和 css
www.iwangzheng.com 目前我们项目中的 CSS/JS 文件比较多, 由于RAILS 3.0 没有提供asset pipeline功能,所以这样会制约我们的访问速度. 例如: 目前,我 ...
- python 最佳入门实践
勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...
- BZOJ 2818
2818:GCD Description 给定整数$N$,求$1\le x,y\le N$且$\gcd{x,y}$为素数的数对$(x,y)$有多少对. Input $N$ Output RT Samp ...
- 序列GCD和问题(题目)
序列GCD和 题目描述 Massacc有一个序列$A_1,A_2,A_3,\dots ,A_n$. Popbab说:我要知道这个序列的和$\pmod{1\times10^9+7}$. Massacc在 ...
- JDBC之java数据库的连接与简单的sql语句执行
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...