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

  • 相关阅读:
    [转]google gflags 库完全使用
    机器学习者面试,看这10个建议
    分享10个数据分析的小技巧(Python)
    工作学习上实用的编程相关知识分享
    前端React 框架- UmiJS有听说过吗?
    PyTorch如何构建深度学习模型?
    Sigmoid 和 Softmax 如何进行函数处理分类?
    从零开始学习机器学习最简单的 kNN 算法
    监督学习中的决策树算法(含代码)
    可视化Bert网络,发掘其中真实世界的嵌入
  • 原文地址:https://www.cnblogs.com/liyiran/p/6491001.html
Copyright © 2011-2022 走看看