• 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

  • 相关阅读:
    【Oracle/MyBatis】Oracle分页语句在MyBatis的Mapper.xml中的实际运用
    ZT:ResultSet的getDate()、getTime()和getTimestamp()比较
    【Oracle】使用sqlldr命令行从csv文件获得数据导入Oracle数据库某表中,如果有数据包括逗号,该怎么办?
    如何在 Linux 中以脚本模式运行 Top
    CentOS 8 安装 Caddy Web服务器
    CentOS下Jenkins安装&&Jenkins端口修改不生效踩坑记录
    Windows 服务器禁用 SSL 2 和 SSL 3 协议 itprobie
    C# Task 使用 WhenAll 和 WaitAll 需要注意的坑
    C# 使用 protobuf 手动生成
    Go gin 接入 prometheus
  • 原文地址:https://www.cnblogs.com/liyiran/p/6491001.html
Copyright © 2020-2023  润新知