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,貌似挺有用的。