针对该设置,影响的是Configuration下的fontScale。
- Configuration conf = getResources().getConfiguration();
- Log.e("TestTAG" , "fontScale=" + conf.fontScale);
- @Override
- public Resources getResources() {
- Resources res = super.getResources();
- Configuration config=new Configuration();
- config.setToDefaults();
- res.updateConfiguration(config,res.getDisplayMetrics() );
- return res;
- }
但是,奇怪的是,如果在onCreate及onResume调用该语句,针对home退出后修改字体再进入的case不能解决。需要配合Activity的属性configChanges。
Android:configChanges="fontScale"
另一个博主,提供了如下方案,未测试,仅作参考。
-
再将
px
转sp
的时候,为了看转化式子的时候看到了metrics.scaledDensity
,于是我就打印这个看了看,然后切换不同的字号的时候,这个是在变的,调成普通显示的值为3.0
。因为我用的1080P
的分辨率,我们知道px
在这种屏幕尺寸上,1dp = 3px
,所以体统改变手机系统的字号,肯定是与scaledDensity
这个属性有关,手机设置里面是改变了系统中scaledDensity的值,从而造成各个APP里面原生的字号被改变,为了能够保持我们界面的不变,所以我们必须拿到不同屏幕尺寸下各个原始的缩放系数,于是开始看DisplayMetrics
里面的属性和方法,发现了density
,尝试着打印出来看了看,发现这个值是固定的,换了台720P
的手机看了看,这个值为2.0
,而之前1080P
上显示的是3.0
,所以这个就是保存原始比例系数的值,到这我们的思路就出来了,只要我们将scaledDensity
的值赋值为density
,这样我们就能保证我们界面中的字号不会随着外部的设置改变而改变。 -
有了上面的步骤,接着我在
Application
中的onCreate
方法中添加了下面的代码
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
displayMetrics.scaledDensity = displayMetrics.density;
但是这个只有刚进入的时候有用,如果我们中途HOME出来,更改了字体大小,我们APP里显示的字号还是会改变的,所以最后我在我们项目的基类BaseActivity中的onCreate()和onRestart()方法中都添加了上述代码。