Android项目中我们经常会用到对话框,有时候我们希望界面设定的按钮点击后不要关闭dialog,,
今天遇到了一个情况就是AlertDialog上面设置3个按钮,“切换”,“确定”,“取消”一个输入框;
需求这样:点击切换然后设置输入框不同的状态,也就是说,我点击切换按钮的时候不应该关闭AlertDialog,但是我们在AlertDialog中加入的按钮点击后,会执行父类Dialog的dismissDialog方法,系统源码如下:
private void dismissDialog() {
if (mDecor == null ) {
if (Config.LOGV) Log.v(LOG_TAG,
" [Dialog] dismiss: already dismissed, ignore " );
return ;
}
if ( ! mShowing) {
if (Config.LOGV) Log.v(LOG_TAG,
" [Dialog] dismiss: not showing, ignore " );
return ;
}
mWindowManager.removeView(mDecor);
mDecor = null ;
mWindow.closeAllPanels();
onStop();
mShowing = false ;
sendDismissMessage();
}
看了上面的代码后才明白为什么我每次点击“切换”按钮总是关闭,原因在于dialog的变量mShowing,在网上百度了一下,很多都是用java的反射得到dialog的属性mShowing(用到反射,是因为这个变量是私有的[private]),所以网上直接是改变它的值为false,相当于欺骗了系统,下面关闭dialog的代码:
mWindowManager.removeView(mDecor);
mDecor = null ;
mWindow.closeAllPanels();
onStop();
mShowing = false ;
sendDismissMessage();
就不执行了。问题终于解决,自己心里也高兴,但是,但是...............................................................
又一个问题来,我们用反射改变了mShowing值后,dialog的isShowing值也随着变化了,我这边在后面的代码中用到了dialog.isShowing();,点击“切换”后,执行到Dialog.isShowing();怎么变成了false,我的dailog明明是显示出来的,后来跟代码找到了就是上面反射出的问题。
反射是强大的,不能随便用,滥用,他里面的mShowing变量为什么没抛出来肯定有它原因的,所以说系统内部的东西不要随便修改,改了后可能出现了意想不到的错误,代码多了查也不好查,要知其所以然后去变通
上面的解决方案可以用反射+全局变量(布尔值),全局变量根据你实际的dialog的isshowing来变化