最近遇到个怪问题,在其他手机上都能正常的显示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不显示之迷相关推荐

  1. android 判断对象,Android网络判断知识小结

    Android中判断当前网络是否可用 应用场景:实现判断当前网络是否可用 当前有可用网络,如下图: 当前没有可用网络,如下图: 实现步骤: 1.获取ConnectivityManager对象 Cont ...

  2. android 判断5g,Android 5G判断

    之前需要用到5G网络信息,花了很长时间才去研究怎么判断是否是5G信号,但无论是官方说明的CellInfoNr,CellIdentityNr,CellSignalStrengthNr,最后连一个网络连接 ...

  3. android 判断标点符号,Android文字标点符号错误

    我的android程序中出现奇怪的文字延伸.每隔一段时间,我都会得到一个奇怪的符号,这个符号的首字母A在顶部......任何想法?Android文字标点符号错误 这是我的代码 package com. ...

  4. com.android.camera.action.crop uri,Android判断com.android.camera.action.CROP是否存在

    版权声明:本文为xing_star原创文章,转载请注明出处! 最近线上报错,有个用户连续crash了10次左右,查看了下堆栈信息,发现是提示com.android.camera.action.CROP ...

  5. Android判断当前Android版本号

    int  version = android.os.Build.VERSION.SDK_INT;   if  (version >  15 ) {   } else {   }  

  6. android判断解锁,android判断手机SIM状态

    释放双眼,带上耳机,听听看~! public String readSIMCard() { TelephonyManager tm = (TelephonyManager)this.getSystem ...

  7. android 判断标点符号,android 标点符号的全角半角转换

    public class BCConvert {     /**      * ASCII表中可见字符从!开始,偏移位值为33(Decimal)      */     static final ch ...

  8. android判断存储卡,Android中判断SD卡状态

    String status = Environment.getExternalStorageState(); if (status.equalsIgnoreCase(Environment.MEDIA ...

  9. Android弹出自定义Dialog,android自定义Dialog实现底部弹窗

    android自定义Dialog实现底部弹窗 拿到这个需求,很多人都是直接想用popWindow 实现,但是这样的效果我们完全可以根据系统的Dialog 自定义一个. AlertDialog.Buil ...

最新文章

  1. android ip rule 策略路由,ip rule 策略路由
  2. 【MySql】 BlackHole :黑洞引擎
  3. 河北经济发展进入新阶段:服务业成主导产业
  4. axure 素材_Axure原型:超漂亮的系统首页
  5. matlab自定义窗口名
  6. java web filter链_filter过滤链:Filter链是如何构建的?
  7. kernal tch 下载 天正_tch kernal.arx
  8. 数据结构之排序算法:基础概念
  9. Sudoku Killer(HDU-1426)
  10. 【zz】Matlab 二值图像形态学函数 bwmorph
  11. SQL Server如何清除连接过的服务器名称历史?
  12. 粒子群优化算法的实现
  13. Vue电商网站项目开发总结
  14. 推导飞机飞行动力学方程组
  15. MATLA 复制文件到指定文件夹
  16. 数据库备份的几种解决方案
  17. 各大邮箱网址用哪个好?企业内部邮箱哪个比较好用?
  18. 通过CMD命令重启服务器
  19. javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>
  20. 两种方法简单实现网站随机语录的显示

热门文章

  1. 4月13日—4月17日四年级课程表
  2. 人均年薪70万!华为项目经理达到了哪些标准?
  3. 蓝牙广播“嗅探”模式应用
  4. 2020CCPC长春站后记
  5. Android应用图标设计
  6. 一、生物丰度计算步骤-以ArcGIS为例
  7. 上银HIWIN、ABBA、PMI、IKO直线导轨型号替换
  8. 完整的thinphp+phpexcel实现excel报表的输出(有图有效果)
  9. 如何远程访问公司的电脑?
  10. 利用向量计算角平分线并判断点相对于角平分线的位置(JAVA版)