zoukankan      html  css  js  c++  java
  • Android 7.0 Dialog 无法显示的问题

    app 在 Android 7.0 上登录的时候, Dialog 不显示了,但是半透明背景显示

    经过搜索和对比,发现出现该问题是因为重写了 getResources() 方法造成的 。重写该方法是为了 app 的字体不会随着手机字体的改变而变化,造成布局混乱,设置字体用到变量 fontScale ,其他的参数不用。

    原始代码:

     1     /**
     2      * 设置 app 不随着系统字体的调整而变化
     3      */
     4     @Override
     5     public Resources getResources() {
     6         Resources resources = super.getResources();
     7         Configuration configuration = resources.getConfiguration();
     8         configuration.setToDefaults();
     9         resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    10         return resources;
    11     }

    源码:configuration.setToDefault() 方法

     1     /**
     2      * Set this object to the system defaults.
     3      */
     4     public void setToDefaults() {
     5         fontScale = 1;
     6         mcc = mnc = 0;
     7         locale = null;
     8         userSetLocale = false;
     9         touchscreen = TOUCHSCREEN_UNDEFINED;
    10         keyboard = KEYBOARD_UNDEFINED;
    11         keyboardHidden = KEYBOARDHIDDEN_UNDEFINED;
    12         hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED;
    13         navigation = NAVIGATION_UNDEFINED;
    14         navigationHidden = NAVIGATIONHIDDEN_UNDEFINED;
    15         orientation = ORIENTATION_UNDEFINED;
    16         screenLayout = SCREENLAYOUT_UNDEFINED;
    17         uiMode = UI_MODE_TYPE_UNDEFINED;
    18         screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
    19         screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
    20         smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
    21         densityDpi = DENSITY_DPI_UNDEFINED;
    22         seq = 0;
    23     }

    在 Android 7.0 上的 PhoneWindow 代码有了变化, DecorView 从 PhoneWindow 中独立出来一个类,同时在初始化的时候,调用了 updateAvailableWidth() 方法

    1     private void updateAvailableWidth() {
    2         Resources res = getResources();
    3         mAvailableWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
    4                 res.getConfiguration().screenWidthDp, res.getDisplayMetrics());
    5     }

    其中会调用 getResources() 方法,但是该方法设置为 setToDefault(),那么获取到的 screenWidthDp 为默认值 SCREEN_WIDTH_DP_UNDEFINED

    1     /**
    2      * Default value for {@link #screenWidthDp} indicating that no width
    3      * has been specified.
    4      */
    5     public static final int SCREEN_WIDTH_DP_UNDEFINED = 0;

    代码中默认值为 0 ,那么 mAvaliableWidth 值为 0 ,所以造成 Dialog 无法显示的问题。

    解决办法:

    只设置 getResource() 方法中的 fontScale 为 1 ,其他的值不修改。

    修改后代码:

     1     /**
     2      * 设置 app 不随着系统字体的调整而变化
     3      */
     4     @Override
     5     public Resources getResources() {
     6         Resources resources = super.getResources();
     7         Configuration configuration = resources.getConfiguration();
     8         configuration.fontScale = 1;
     9         resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    10         return resources;
    11     }

    参考:http://www.jianshu.com/p/9be83be8d1ef

  • 相关阅读:
    进程 触发器
    关于 if条件 光标 循环的综合应用
    3-15记录
    day3.python 学习之列表
    day2: python3.5学习——逻辑判断
    day1: python3.5学习
    OpenGL_曲线函数
    OpenGL_赛平斯基垫片
    【quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
    Python正则表达式指南
  • 原文地址:https://www.cnblogs.com/liyiran/p/6491001.html
Copyright © 2011-2022 走看看