android 判断dialog,Android 7.0经验谈:Dialog不显示之迷
最近遇到个怪问题,在其他手机上都能正常的显示Dialog,但是在Android 7.0的手机上只能显示Dialog的半透明背景,无法显示Dialog的内容。
用图给大家展示一个遇到的现象,正常时应该是这个样子的:
而我们遇到的情况如下,更坏的是如果我们设置Dialog不能点击空白处取消(dismiss),那么这个半透明背景一直覆盖在Activity上面,只有通过杀进程重新运行应用才能去掉它。
因为项目工程比较大,排查这个问题也花费了很多时间。我最开始时在Android 7.0写一个Demo显示Dialog发现是正常的,然后再在自己的框架上显示Dialog发现也是正常的,说明不是框架的问题。
在测试了一些怀疑地方没有效果后,只有用土办法挨个排查了,两个方向一个是不断的注释各个模块看是否正常显示,第二个是从正常开始加上各个模块看那个模块代码加上了出问题。最后发现罪魁祸首是下面这段代码:
Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
//解决修改系统字体大小时,应用页面布局、字体等显示或者排版混乱问题
config.setToDefaults();
在Application的onCreate方法会执行这段代码去设置资源的Configuration。再分析setToDefaults的源码,主要是进行了如下的初始化设置:
/**
* Set this object to the system defaults.
*/
public void setToDefaults() {
fontScale = 1;
mcc = mnc = 0;
locale = null;
userSetLocale = false;
touchscreen = TOUCHSCREEN_UNDEFINED;
keyboard = KEYBOARD_UNDEFINED;
keyboardHidden = KEYBOARDHIDDEN_UNDEFINED;
hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED;
navigation = NAVIGATION_UNDEFINED;
navigationHidden = NAVIGATIONHIDDEN_UNDEFINED;
orientation = ORIENTATION_UNDEFINED;
screenLayout = SCREENLAYOUT_UNDEFINED;
uiMode = UI_MODE_TYPE_UNDEFINED;
screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
densityDpi = DENSITY_DPI_UNDEFINED;
seq = 0;
}
其实看了一下很容易看出screenWidthDp和screenHeightDp比较可疑,测试了一下也确实是这两个值被设置成0后(SCREEN_WIDTH_DP_UNDEFINED = 0)Dialog的内容布局就无法显示了。
那么,为什么同样的代码在Android 7.0之前的系统是好的呢?
我们知道Dialog本质上也是一个PhoneWindow对像,显示时被加到WindowManager,由WMS负责显示。从DDMS的HierarchyView工具我们也可以看出,Dialog是一个PhoneWindow,且位于Activity的PhoneWindow之上,并且它的DecorView并不是全屏的。
在Android 7.0 DecorView被独立成一个类DecorView.java,之前的版本是
PhoneWindow的内部类,每次DecorView初始化时会进行一个更新:
private void updateAvailableWidth() {
Resources res = getResources();
mAvailableWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
res.getConfiguration().screenWidthDp, res.getDisplayMetrics());
}
在这个方法里我们遇到了之前设置为0的res.getConfiguration().screenWidthDp,把DecorView的mAvailableWidth设置为0,自然无法看到Dialog的Layout内容(宽度为0)。而7.0之前的版本并没有这项设置。
疑问
Activity的界面也是一个PhoneWindow,为什么screenWidthDp为0后Activity的Layout还是可以正常展示呢?如下图所示,Activity的DecorView的宽并不是受screenWidthDp的影响。
从DecorView.java的onMeasure方法中我们看到,是否使用mAvailableWidth(updateAvailableWidth方法中赋值)还要看TypedValue的类型,可以判断Dialog和Activity应该是在这个类型上有所区别,使得这个设置对Activity没有什么影响。
android 判断dialog,Android 7.0经验谈:Dialog不显示之迷相关推荐
- android 判断对象,Android网络判断知识小结
Android中判断当前网络是否可用 应用场景:实现判断当前网络是否可用 当前有可用网络,如下图: 当前没有可用网络,如下图: 实现步骤: 1.获取ConnectivityManager对象 Cont ...
- android 判断5g,Android 5G判断
之前需要用到5G网络信息,花了很长时间才去研究怎么判断是否是5G信号,但无论是官方说明的CellInfoNr,CellIdentityNr,CellSignalStrengthNr,最后连一个网络连接 ...
- android 判断标点符号,Android文字标点符号错误
我的android程序中出现奇怪的文字延伸.每隔一段时间,我都会得到一个奇怪的符号,这个符号的首字母A在顶部......任何想法?Android文字标点符号错误 这是我的代码 package com. ...
- com.android.camera.action.crop uri,Android判断com.android.camera.action.CROP是否存在
版权声明:本文为xing_star原创文章,转载请注明出处! 最近线上报错,有个用户连续crash了10次左右,查看了下堆栈信息,发现是提示com.android.camera.action.CROP ...
- Android判断当前Android版本号
int version = android.os.Build.VERSION.SDK_INT; if (version > 15 ) { } else { }
- android判断解锁,android判断手机SIM状态
释放双眼,带上耳机,听听看~! public String readSIMCard() { TelephonyManager tm = (TelephonyManager)this.getSystem ...
- android 判断标点符号,android 标点符号的全角半角转换
public class BCConvert { /** * ASCII表中可见字符从!开始,偏移位值为33(Decimal) */ static final ch ...
- android判断存储卡,Android中判断SD卡状态
String status = Environment.getExternalStorageState(); if (status.equalsIgnoreCase(Environment.MEDIA ...
- Android弹出自定义Dialog,android自定义Dialog实现底部弹窗
android自定义Dialog实现底部弹窗 拿到这个需求,很多人都是直接想用popWindow 实现,但是这样的效果我们完全可以根据系统的Dialog 自定义一个. AlertDialog.Buil ...
最新文章
- android ip rule 策略路由,ip rule 策略路由
- 【MySql】 BlackHole :黑洞引擎
- 河北经济发展进入新阶段:服务业成主导产业
- axure 素材_Axure原型:超漂亮的系统首页
- matlab自定义窗口名
- java web filter链_filter过滤链:Filter链是如何构建的?
- kernal tch 下载 天正_tch kernal.arx
- 数据结构之排序算法:基础概念
- Sudoku Killer(HDU-1426)
- 【zz】Matlab 二值图像形态学函数 bwmorph
- SQL Server如何清除连接过的服务器名称历史?
- 粒子群优化算法的实现
- Vue电商网站项目开发总结
- 推导飞机飞行动力学方程组
- MATLA 复制文件到指定文件夹
- 数据库备份的几种解决方案
- 各大邮箱网址用哪个好?企业内部邮箱哪个比较好用?
- 通过CMD命令重启服务器
- javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>
- 两种方法简单实现网站随机语录的显示