打开源码,首先映入眼帘的是三个构造方法,但这三个构造方法都是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

http://www.cnblogs.com/jqyp/archive/2011/06/17/2083533.html

Android开发AlertDialog解析的更多相关文章

  1. android 开发AlertDialog.builder对话框的实现

    AndroidAPI提供了Dialog对话框控件,但google明确指出不建议开发者只是使用Dialog来创建对话框,而应该自定义对话框或者使用API中提供的Dialog的子类,如AlertDialo ...

  2. Android开发pool解析xml

    xml在开发中的作用不可小觑,很多时候我们都要用到这种文件,所以学习它的解析方式很是必要. 我们都知道java中xml的解析有:dom,SAX,但是Android下我们使用pool解析,是更为方便,而 ...

  3. Android开发-AlertDialog,Progress,ProgressDialog,自定义layout

    AlertDialog 默认样式 单选样式 多选样式 自定义样式 效果图   AlertDialog效果图 class OnClick implements View.OnClickListener ...

  4. Android开发_Gson解析

    //转换器 GsonBuilder builder = new GsonBuilder(); // 不转换没有 @Expose 注解的字段 builder.excludeFieldsWithoutEx ...

  5. 【Android开发日记】之入门篇(十三)——Android的控件解析

    Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件. 一.An ...

  6. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  7. Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml

    Android开发:碎片Fragment完全解析   为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activi ...

  8. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  9. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...

随机推荐

  1. HDU 5995 Kblack loves flag (模拟)

    题目链接 Problem Description Kblack loves flags, so he has infinite flags in his pocket. One day, Kblack ...

  2. NYOJ 93 汉诺塔 (数学)

    题目链接 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片 ...

  3. VC进度条的使用

    m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m ...

  4. Verilog笔记.1.基本语法

    0.前 抽象模型分级: • 系统级(system):用高级语言结构实现设计模块的外部性能的模型.• 算法级(algorithm):用高级语言结构实现设计算法的模型.• RTL级(Register Tr ...

  5. php常用表单验证类用法实例

    <?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 func ...

  6. Centos更新配置文件命令

    source 命令是 bash shell 的内置命令,从 C Shell 而来.source 命令的另一种写法是点符号,用法和 source 相同,从Bourne Shell而来.source 命令 ...

  7. 短信API——短信验证码

    简介 短信服务(Short Message Service.SMS)是指通过调用短信发送API,将指定短信内容发送给指定手机用户. 阿里云短信服务 阿里云短信服务产品介绍:https://www.al ...

  8. Spring之IOC,DI,动态代理,反射

    Spring框架是J2EE开发中一个使用广泛的框架,它使得dao和service层的维护更加便利.Spring框架有两个重要的特征,一个是IOC,另一个是AOP.我们在这里主要介绍IOC,以及IOC中 ...

  9. C语言获取输入,按单词输出

    #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { int num; printf ...

  10. numpy,看不懂,但很利害

    慢慢有感觉.. 截几个图看看. import numpy as np np.random.seed(42) complex_numbers = np.random.random(5) + 1j * n ...