关于Android中利用java反射阻止dialog的关闭问题

来源:互联网 发布:淘宝网帽子女士太阳帽 编辑:程序博客网 时间:2024/05/16 09:59

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来变化

 

0 0