AlertDialog解析

【转载】出处:http://www.cnblogs.com/shaweng/p/3800238.html
打开源码,首先映入眼帘的是三个构造方法,但这三个构造方法都是protected类型的,不允许我们直接实例化AlertDialog.。因此,我们再看别的有没有方法.可以实例化 。

再仔细一看,发现一个变量 :AlertController mAlert, 这个才是我们今天的主角,重点研究它.

mAlert的定义在 ,以上我们提到的AlertDialog的构造函数,

AlertDialog(Context context, int theme, boolean createThemeContextWrapper) {
        super(context, resolveDialogTheme(context, theme), createThemeContextWrapper);

        mWindow.alwaysReadCloseOnTouchAttr();
        mAlert = new AlertController(getContext(), this, getWindow());
    }

此外,我们还发现,AlertDialog中几乎所有的方法都是通过这个mAlert变量来操作的。

也就是说,AlertDialog是一个空壳,并没有实际的作用, 它的实质是AlertController类. 就是我刚才说的 “主角” 。 而Alertcontroller是android内部类,在package com.android.internal.app包中,不能在Eclipse中通过ctrl键来跟踪源码,可以使用Source Insight软件打开该软件源码查看。

再往下看,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() ; 
在安卓中要改变AlertDialog的外观是非常不容易的事情,即便是HoneyComb之后增加了android:singleChoiceItemLayout属性。AlertDialogPro可以让事情变得简单,它包含了AlertDialog的所有功能,同时还具有灵活的自定义功能,代码中还自带了已经定义好的holo和material 两种风格的对话框。项目地址:https://github.com/fengdai/AlertDialogPro 效果图:如何使用1.创建AlertDialogPro除了将AlertDialog.Builder替换成AlertDialogPro.Builder之外其他的和AlertDialog没有区别。AlertDialogPro.Builder builder = new AlertDialogPro.Builder(getContext()); builder.setTitle("Title").        setIcon(R.drawable.ic_launcher).        setMessage("Message").        setNeutralButton("Neutral", null).        setPositiveButton("OK", null).        setNegativeButton("Cancel", null).        show();2.holo风格的dialog包含两种holo:Theme.AlertDialogPro.Holo和Theme.AlertDialogPro.Holo.Light只需在style文件中加入alertDialogProTheme属性:<style name="AppTheme" parent="AppBaseTheme">   ...   <!-- Use Holo dark theme as global theme of this app -->   <item name="alertDialogProTheme">@style/Theme.AlertDialogPro.Holo</item> </style>或者是在代码中创建dialog的时候设置:AlertDialogPro.Builder builder = new AlertDialogPro.Builder(getContext(), R.style.Theme_AlertDialogPro_Holo_Light);3.Material风格的dialog包含Theme.AlertDialogPro.Material 和Theme.AlertDialogPro.Material.Light 两种风格,使用方法和上面的holo差不多,但是需要AppCompat-v21的支持。4.自定义如果其中某一种风格符合你的绝大部分需求,但是需要做些改动,你可以设置以下属性:<!-- Minimum height of title panel--> <attr name="adpTitleMinHeight" format="dimension" /> <!-- The text appearance for the dialog's message text --> <attr name="adpMessageTextAppearance" format="reference" /> <!-- Minimum height of ListView's items --> <attr name="adpListItemMinHeight" format="dimension" /> <!-- The text color for ListView's items --> <attr name="adpListItemTextColor" format="reference|color" /> <!-- The text appearance for normal ListView's items --> <attr name="adpListItemTextAppearance" format="reference" /> <!-- The text appearance for "multi-choice" ListView's items --> <attr name="adpListMultiChoiceTextAppearance" format="reference" /> <!-- The text appearance for "single-choice" ListView's items --> <attr name="adpListSingleChoiceTextAppearance" format="reference" /> <!-- Divider for the ListView --> <attr name="adpListDivider" format="reference" /> <!-- Selector in a ListView --> <attr name="adpListItemBackground" format="reference" /> <!-- Style for button bars --> <attr name="adpButtonBarStyle" format="reference" /> <!-- Style for buttons within button bars --> <attr name="adpButtonBarButtonStyle" format="reference" /> <!-- Style for the "positive" buttons within button bars --> <attr name="adpButtonBarPositiveButtonStyle" format="reference" /> <!-- Style for the "negative" buttons within button bars --> <attr name="adpButtonBarNegativeButtonStyle" format="reference" /> <!-- Style for the "neutral" buttons within button bars --> <attr name="adpButtonBarNeutralButtonStyle" format="reference" />你甚至可以设置alertdialog的整个布局,如果你需要的是高度自定义的dialog,这是非常重要的。<style name="AlertDialogPro.Material">   <!-- As HoneyComb's android:layout.        Specify your AlertDialogPro's layout -->   <item name="adpLayout">@layout/adp_alert_dialog_material</item>   <!-- As HoneyComb's android:listLayout.        Specify your AlertDialogPro's ListView layout. -->   <item name="adpListLayout">@layout/adp_select_dialog_material</item>   <!-- As HoneyComb's android:listItemLayout.        Specify your AlertDialogPro's list item layout. -->   <item name="adpListItemLayout">@layout/adp_select_dialog_item_material</item>   <!-- As HoneyComb's android:multiChoiceItemLayout.        Specify your AlertDialogPro's multi choice list item layout. -->   <item name="adpMultiChoiceItemLayout">@layout/adp_select_dialog_multichoice_material</item>   <!-- As HoneyComb's android:singleChoiceItemLayout.        Specify your AlertDialogPro's single choice list item layout. -->   <item name="adpSingleChoiceItemLayout">@layout/adp_select_dialog_singlechoice_material</item> </style>使用上面自定义的alertdialog<item name="alertDialogProStyle">@style/AlertDialogPro.Material</item>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值