从Android4.0系统以后,提供了设置“字体大小”来改变系统字体的选项。当然,这对于老人机的厂商来说也算是个福音,只不过对于开发者来说,就略有些坑了。因为从如果用户设置了放大或者缩小字号的时候,如果字体或者有些地方用了sp做单位,布局就会乱了。
网上一搜,还是有很多解决方案的。普遍的做法是在Acitivty基类里面重写getResources()方法,如下:
@Override
public Resources getResources() {
Resources res = super.getResources();
Configuration config = new Configuration();
config.setToDefaults();
res.updateConfiguration(config, res.getDisplayMetrics());
return res;
}
这种做法确实能起到作用。不过经多次测试发现,在界面渲染时会一直调用getResources(),从而拉低app的性能,元素太多的界面切换、操作都会出现卡顿的现象。
目前也没找到太好的解决方案,现在想到的解决方案有两个:
1、项目全部采用dp单位,就可以在不重写getResources()的前提下,即使设置了系统字号也不会搞乱布局。
2、在需要适应切换字号的界面,才重写getResources()。
按照方法2,可以对getResources()做稍微调整。
private boolean needCustomResources(){
return true;
}
@Override
public Resources getResources() {
Resources res = super.getResources();
if(needCustomResources()){
Configuration config = new Configuration();
config.setToDefaults();
res.updateConfiguration(config, res.getDisplayMetrics());
}
return res;
}
这样,在不需要适应字号的界面,只要重写一下neeCustomResources(),返回false就OK了。
这两个都是折中的方法,如果有其他方案的,期待分享!