Dialog可以算是每个项目都能使用的基础控件之一.
最近功能开发中,因为需求问题,使用到Support-V7 下的Dialog
不熟悉如何使用或者对该控件较为陌生可以参考链接:AlertDialog 使用
项目的效果图:
(PS:本人对UI理解较差,动手绘图能力新手水平,勿喷)
大概分析了之后,决定使用V7下的AlertDialog之后,代码即将结束的时候,卡顿在对于效果图中"取消"的这个手动操作功能。
当时我的代码是这样的:
<span style="font-size:18px;"> private void _initializeDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = getLayoutInflater().inflate(layoutId, null);
/**
* 省略..
*/
btnCancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
<span style="color:#ff0000;"> //一开始此处的逻辑操作是如此计划的。(此处使用try-catch表示)
try{
builder.dismiss();
}catch("No Such Method has found~"){
// 报错???没有这个方法?不可能吧?让我想想?
}finally{
//去看源码
}</span>
}
});
}</span>
不甘心,去查看Dialog源码:
由于源码过多,只截图部分重要代码,如下图:
从源码中我们可以看到几个地方:
- Dialog的构造方法为Protected
- 内部类Builder是public static
- Builder内部类中Create()方法返回的是一个new AlertDialog对象
- Builder内部类中Show()方法只是对Create()方法返回对象控制
仔细 分析一下,Builder内部类可以抽象看成是对Dialog内容的一个构造类,包含了诸多比如:setView和setText等设置Style的方法,其实Dialog的源码理解起来比较好理解。
回归正题,如何在使用AlertDialog.Builder时候调用Dismiss()呢?
在这之前,我看了一些论坛里对于这个问题的解决办法的探讨,比如一些人说用 mBuilder(AlertDialog.Builder 实例化的对象),直接调用mBuilder.create()-->此时
if( mBuilder.Create() instance of AlertDialog){
...
}
答案是:
return true;
So,有人提出了 使用mBuilder.Create().dismiss()方法。
根据上面的截图,我们发现Create()方法返回的是一个new AlertDialog()对象,持有的对象发生改变了,还能控制么???
按照笔者的理解,对于V7包下的Dialog使用方式应该是:
<span style="color:#ff0000;"> mDialog=new AlertDialog.Builder(this).create();
/**
* 此处不做详细操作,可以任意控制
*/
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
}
});
mDialog.show();</span>