问题描述
需求是要保证APP的文字大小不受系统文字大小设置的影响。
我在搜索了相关问题之后,采用了重写getResource方法和onConfigurationChanged方法,同时在manifest文件中给activity进行配置的办法来解决这个问题。正常打开APP没有任何问题,字号确实不会随着系统设置而变化。
(Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改
)
但是这样做,在华为平板(揽阅M2青春版,Android 5.1.1,EMUI 3.1)上没有问题,在小米手机(米6,Android 8.0,MIUI 10.3稳定版)上,**切换了字号之后回到APP,APP会自尽(不是闪退,下面会说)**。
代码展示
AndroidManifest.xml
<!-- 主界面 -->
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden|fontScale|locale|layoutDirection|keyboard"
android:exported="false"
android:launchMode="standard"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
BaseActivity.java
@Override
public void onConfigurationChanged(Configuration newConfig) {
LogHelper.customLogging("showControl",this.getClass().getName()+"执行了 onConfigurationChanged");
if (newConfig.fontScale != 1)//非默认值
getResources();
super.onConfigurationChanged(newConfig);
}
/**
* 重写 getResource 方法,防止系统字体影响
*/
@Override
public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
android.content.res.Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
日志信息
这是我的米6的日志
红线处执行的操作是:
1、APP进入后台;2、更改系统文字大小;3、APP回到前台;
可以看到mainActivity在完成了自己应该做的操作(销毁、创建、展示)后多做了一次销毁操作。而且onConfigurationChanged方法中的日志也没有被打印。
所以米6走的路径是相当于ManiFest文件中没有配置fontScale。
这是华为平板的日志
红线处操作同上
这里就执行了onConfigurationChanged方法,只需要重新显示一下activity就可以了。
自己的分析
多了一个onDestroy,导致了APP还活着(AndroidStudio的Logcat一栏显示的包名后面没有DEAD字样),但是Activity已经没了,所以显示的是桌面,看起来是闪退一样,但其实只是他自尽了……
#**各位大神,救救孩子,这个问题怎么解决啊?!**