2021-10-27

关于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小游戏,会显示网络错误,无法正常打开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值