关于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来变化
- 关于Android中利用java反射阻止dialog的关闭问题
- AlertDialog通过反射机制阻止Dialog关闭
- AlertDialog通过反射机制阻止Dialog关闭
- AlertDialog通过反射机制阻止Dialog关闭
- AlertDialog通过反射机制阻止Dialog关闭
- 利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android 关于Dialog的关闭设置
- 东南大学 38: 外星人来袭
- VS2012 窗口布局, update1 和 英语语言包 离线安装方法
- mysql修改数据库所有字段的长度
- IOS 上传多张图片
- Java 5.0 泛型之 Java泛型接口
- 关于Android中利用java反射阻止dialog的关闭问题
- cocos2d-x节点(b2Body.h)API
- linux安装mysql---源码安装
- LA 4329(树状数组)
- 关于vs2008下报PRJ0019错误的方法
- HSI、HSV、RGB、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型的区别
- ipv6 ipv4的不同
- 构造函数中的类型转化和反构造函数
- MySql 常用命令