美文网首页
android 修改系统字体引发UI错乱奔溃问题

android 修改系统字体引发UI错乱奔溃问题

作者: 唐小鹏 | 来源:发表于2020-03-24 18:02 被阅读0次

测试小姐姐测试版本的时候,把系统字体给变大了,再回到app直接崩溃,分析原因找问题,主要有2种方式
第一种.设置字体大小我们都是用的是sp,如果改为dp就不会有这个问题, 我相信大部分写android的都是用的sp,现在改回来肯定是头痛,别着急,我们先看看源码

public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics){
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

density不会受到用户配置的影响,而scaledDensity除了会受到用户配置的影响,其它方面是跟density一致的。
终于真相大白!因此使用 sp 单位时字体大小会受到用户配置系统字体的影响。
但是这种方式还是不推荐.

第二种
直接通过代码控制,不跟随系统改变字体

 /**
  * 重写 getResource 方法,防止系统字体影响
 */
    @Override
    public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
        Resources resources = super.getResources();
        if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
            android.content.res.Configuration configuration = resources.getConfiguration();
            configuration.fontScale = 1.0f;
            configuration.setToDefaults();//设置默认 不能使用这个,会修改很多对方的属性值,比如在5.1版本适配有问题
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        }
        return resources;
    }

这样又有这个问题,Android 8.0上会发现这样修改字体的缩放比例是不起作用.需要在Activity中同样进行复写getResources()方法。

还得注意一个问题,切换了系统字体后,回到Activity会重启当前页面,为了避免这种问题,需要在:在manifest中的Activity中添加: android:configChanges="orientation|screenSize|keyboardHidden|fontScale"

这样可能就完美解决问题了

相关文章

网友评论

      本文标题:android 修改系统字体引发UI错乱奔溃问题

      本文链接:https://www.haomeiwen.com/subject/eddyjhtx.html