在APP中,字体的大小单位一般会用sp,然而在改变系统字体大小时,App字体就会随着系统字体大小改变而改变,这就可能造成APP布局的错位。
造成这种情况的原因是,sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通常情况下,建议使用sp来跟随用户字体大小设置。除非一些特殊的情况,不想跟随系统字体变化的,可以使用dp”。按照这么说,布局宽高固定写死的地方应该统一用dp显示字体,因为一旦用户在设置中调大字体,宽高写死的布局显示就乱了。
针对这种情况,查找网上的方法也很多,大多是这样的方法 (重写 Application 或 BaseActivity 中的方法):
/**
* 重写 getResource 方法,防止系统字体影响
*/
@Override
public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
Resources resources = super.getResources();
Configuration configuration = new Configuration();
configuration.setToDefaults();
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return resources;
}
从上代码可以看出Configuration是new出来的对象,那么系统中原本自带的许多属性可能就遗失了。在大多数的情况下,我们不会察觉到这样的差异。但是在某些情况下,发现出现了空指针;还有就是,configuration.setToDefaults()时,会把所有属性都设置成系统默认,对于有特殊需求的 app 来说是不合理的,这里应该只修改字体大小的设置。
在此就不再多做赘述,最总解决办法是在Application中重写getResources()方法:
/**
* 重写 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;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
两者代码的不同之处,请自行比较吧!
满心欢喜的以为问题就这么愉快地解决了。将app放在Android8.0上运行,然后将手机的字体设置成最大后发现,问题并没有解决。这时还需要在BaseActivity中同样进行重写getResources()方法。这样当前字体大小的问题就可以解决了。
到这里问题应该是解决了,惊奇的发现Android 8.0的手机不单单有字体大小设置,还有一项显示模式 , 将显示模式设成最大后,发现app的界面超出了屏幕。(注:部分Android7.0手机也会有显示模式这一项,但是将显示模式设置成最大,不会影响app的界面的,只有Android8.0及其以上才会出现这种情况)。
注:目前这种情况我还没有找到解决的办法,有了解决办法,我会在这个博客更新,大神们有解决办法还望留言告知我,大家相互分享。