您的位置:首页 > 产品设计 > UI/UE

[android]AlertDialog和AlertDialog.Builder

2015-10-21 20:01 911 查看
        上课的时候在用AlertDialog,但是发现AlertDialog竟然不能直接实例化,而必须用AlertDialog.Builder。觉得挺奇怪的,查下手册,关于该类的层次结构、说明这些反正自己看下就可以了,(原版的AlertDialog说明在安卓文件夹下的SDK下的docs/reference/android/app/AlertDialog.html,网上的博文:http://blog.csdn.net/lilu_leo/article/details/8221423),重点关注下它的三个构造函数,我们发现这个构造函数竟然是Protected的,那样我们就不能直接用来实例化了(至于为什么这么做并不是很清楚,可以自己去查下),那么该怎么办?

        通过在百度查找“构造函数是Protected”,获知这种情况下应该会存在一个子类,然后该子类的构造函数就是Public的,所以继续看手册,看到最开始有提到AlertDialog有个子类AlertDialog.Builder。那么我们就可以用这个子类来进行实例化了。

        在实例化过程中,Alert.Builder的构造函数有个参数是Context类型的,本来可以直接用getApplicationContext()来获取当前的Context,但是使用的时候发现APP闪退,然后如果使用[ActivityName].this(这里的[ActivityName]是指当前Activity的名字),则可以。这样就又需要去查阅this和getApplicationContext()的区别,前者和Activity关联,后者和Application关联。我们需要的是当前的Activity。但是这样写的话万一移植到其他的Activity就需要去改下这个名字,那么直接用this不就可以了。但是测试了下发现如果我的代码直接放在Activity的OnCreate里是正常的,但是当我把这些代码放到按钮的Click监听事件处理函数里的时候就提示这个this出问题了:The
constructor AlertDialog.Builder(new View.OnClickListener(){}) is undefined,也就是这个构造函数是没有定义的,因为这个this就表示当前的OnClickListener对象了而不是我们想要的Context。

        那怎么办?既然this只有在OnCreate里是正确的类型,那么我们就定义一个全局的对象变量来保存这个this不就OK了。全局变量:private Context myContext;在OnCreate方法里赋值:myContext=this;然后就可以在按钮监听事件处理函数里使用了:AlertDialog.Builder myDialog=new AlertDialog.Builder(myContext);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android