[android]AlertDialog和AlertDialog.Builder

        上课的时候在用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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值