方式一:禁用系统字体缩放功能
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.fontScale != 1) {
//非默认值
getResources();
}
super.onConfigurationChanged(newConfig);
}
@Override
public Resources getResources() {
Resources res = super.getResources();
//非默认值
if (res != null) {
if (res.getConfiguration().fontScale != 1) {
Configuration config = res.getConfiguration();
if (config != null && config.fontScale != 1.0f) {
config.fontScale = 1.0f;
res.updateConfiguration(config, res.getDisplayMetrics());
}
}
}
return res;
}
方式二:使用自己的自定义字体缩放功能
@Override
protected void attachBaseContext(Context context) {
Configuration config = context.getResources().getConfiguration();
config.fontScale = 3.0f;
context = context.createConfigurationContext(config);
super.attachBaseContext(context);
}
关于安卓app设置字体大小,且不重启应用的测试:
1.配置字体大小方式:
在Activity的attachBaseContext(context)方法里面配置Configuration.fontScale即可。
2.配置之后的相关问题:
目前修改字体缩放比例之后必须重新进入页面才能生效,就是说设置字体之前开启的所有页面还是使用的设置之前的字体大小,不影响正常功能,关闭之后重新进入就是新配置的字体大小了,可以使用recreate()方法,此方式会走保存状态的逻辑,但是也会执行页面的onDestory()方法。
为了不重启页面,目前采用的间接方式是,遍历获取所有TextView,并根据比例设置缩放比例之后的字体大小,此方式需配合Resources.updateConfiguration(Configuration config, DisplayMetrics metrics)方法使用,updateConfiguration用于更新Resources内部字体大小缩放比例配置,不使用会出现通过其他方式刷新的控件展示的字体回到原来的大小,但是此方式目前被标识为已过时,8.0之后版本不建议使用,所以使用此方式会有高版本适配问题。另外,即使使用此方式,如果页面布局复杂,例如使用RecycleView多嵌套,强制刷新并不能完全生效,测试过程中也出现了多次切换字体大小之后配置无异常,但是字体大小不生效的问题,猜测是页面多次退出进入相关实例被放入缓存,部分配置未更新导致。
网友评论