关于app字体不随系统改变而变化的问题
最近做到这个需求,要求app内字体不跟随系统调大了文字而改变。在网上找了半天,找到的都是大概如下方法:
Resources resources = super.getResources();
Configuration config = resources.getConfiguration();
if(config.fontScale!=1f){
config.fontScale = 1f;
return createConfigurationContext(config).getResources();
}else{
return resources ;
}
经过我实际测试,测试环境为小米K40Pro,安卓11。发现不管我系统字号怎么设置,获取到的config.fontScale总是为1.0。不知道是不是因为小米系统的问题。因为总是为1.0导致if判断为false,直接return了resource。无法重新赋值fontScale为1f/1.0/1.0f。
解决方案为。去掉if判断。总是执行config.setToDefaults(); 或者 config.fontScale = 1f;
10.29更新:
发现使用这种方式后,导致出现大量莫名其妙的问题。怀疑是跟重写getResources有关。
APP页面结构为viewpager+fragment。
首次发现问题:
在一个fragment中点击按钮打开一个第三方的H5小游戏sdk。这时候就会崩溃,错误信息为
android.view.InflateException: Binary XML file ............Error inflating class <unknown>
后来将fragment所在的activity里面的重写getResources改为了重写attachBaseContext
@Override
protected void attachBaseContext(Context newBase) {
Configuration config = newBase.getResources().getConfiguration();
config.fontScale=1;
Context context=newBase.createConfigurationContext(config);
super.attachBaseContext(context);
}
解决了这个问题。
但是后续又陆续出现多个各种页面报错Binary XML file Error inflating class的情况,
例如:
在fragment A中打开手机号一键登录,登录成功,返回fragment A,然后切换到fragment B,这时就会崩溃。经测试发现如果不调起一键登录就不会出问题。
例如:
在fragment A中打开ActivityA,关闭ActivityA,再切换fragment崩溃。关闭ActivityA后再打开一键登录,崩溃。
由于所有Activity都继承自BaseActivity,BaseActivity中重写了getResources,删除重写的getResources部分恢复正常。
具体原因,解决方法还没有找到
有网友给出了一个方法,重写activity的onstart方法
@Override
protected void onStart() {
super.onStart();
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
displayMetrics.scaledDensity = displayMetrics.density;
}
我的实际效果是有效果,但不是100%有效。重启APP后第一次打开activity无效,关闭activity后重开才起效果。并且打开某些第三方sdk的时候还存在问题,比如瑞狮H5小游戏,会显示网络错误,无法正常打开。