Dialog的dismiss和cancel 区别 (转)

凉白开 2012-12-03

Dialog的dismiss和cancel

AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同?

今天有时间,看了看源码(其实源码并不是全都那么深奥的!~~)。

AlertDialog继承与Dialog,现在各位看看结构图:

[attachment=1826]

然后在Dialog类中找到了dismiss和cancel方法的实现。重要看dismiss的源码:

Java代码

publicvoidcancel(){

if(mCancelMessage!=null){

//Obtainanewmessagesothisdialogcanbere-used

Message.obtain(mCancelMessage).sendToTarget();

}

dismiss();

}

看明白了吧!在cancel方法中调用了dismiss方法。但是现在还有一个问题就是:mCancelMessage是什么?

privateMessagemCancelMessage;//这是源码中的声明

然后再来看源码:

Java代码

publicvoidsetOnCancelListener(finalOnCancelListenerlistener){

if(listener!=null){

mCancelMessage=mListenersHandler.obtainMessage(CANCEL,listener);

}else{

mCancelMessage=null;

}

}

publicvoidsetCancelMessage(finalMessagemsg){

mCancelMessage=msg;

}

现在问题清楚了,就是如果你在创建AlertDialog的时候调用了setOnCancelListener这个mCancelMessage变量有作用,否则dismiss和cancel等同。

另外在看源代码的时候发现,Dialog还有一个方法叫做setCanceledOnTouchOutside,貌似挺有用的。

相关推荐