问题描述
1、App内切换语言(Demo:https://github.com/finddreams/AndroidMultiLanguage),并调用一下代码重启页面
if (getString(R.string.language_zh_cn).equals(iOption.getName())) {
MultiLanguageUtil.getInstance().updateLanguage(mActivity, LanguageType.LANGUAGE_CHINESE_SIMPLIFIED);
} else if (getString(R.string.language_en).equals(iOption.getName())) {
MultiLanguageUtil.getInstance().updateLanguage(mActivity, LanguageType.LANGUAGE_EN);
} else if (getString(R.string.use_system).equals(iOption.getName())) {
MultiLanguageUtil.getInstance().updateLanguage(mActivity, LanguageType.LANGUAGE_FOLLOW_SYSTEM);
} else if (getString(R.string.language_zh_tw).equals(iOption.getName())) {
MultiLanguageUtil.getInstance().updateLanguage(mActivity, LanguageType.LANGUAGE_CHINESE_TRADITIONAL);
}
Intent intent = new Intent(mActivity, SplashActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
2、这时候看到的界面都是正常的,该显示英文的显示英文,该显示繁体的显示繁体。
3、杀掉app,重新打开。神奇的一幕发生了,前面打开的几个界面,都显示的是系统默认语言。而且打印
getResources().getConfiguration().locale
得到的也确实是"zh"。
但同时,之后打开的界面又都正确的显示了修改的语言。
问题:
这就奇怪了,为什么是同一套代码,app杀死重启后的前几个界面没有渲染出我想要的语言呢?
解决:
我参考了别人的demo,发现别人的demo在我手机里运行是正常的,无论如何杀死app都不影响。这就奇怪了不是?所以,开始用排查法对比代码。
开始分析
1、对比切换语言的代码,我是直接copy的,排除;
2、对比调用的代码,Application、BaseActivity等关键位置一致,没有问题,排除;
3、对比依赖,发现我的androidx.appcompat:appcompat与他人正常的版本不同,而BaseActivity继承自此库中的AppCompatActivity,故此推测,它有重大嫌疑
implementation 'androidx.appcompat:appcompat:1.2.0' (我的,有嫌疑版本)
implementation 'androidx.appcompat:appcompat:1.3.0'
动手替换
1、更换依赖,将androidx.appcompat:appcompat改成1.3.0;
2、重新运行app,查看成果;
3、发现无论如何重启app,都可以从头至尾正确的渲染出我想要的语言。
结论
1、这是系统库appcompat的坑,如果你的项目也需要适配多语言,建议使用1.3.0及以上版本。
补充
开篇分享的demo中,通过application.getString(R.string.xx)获取的文案可能不会获取到预期的字符串,需要在Application - attachBaseContext中做出一些调整,具体如下
@Override
protected void attachBaseContext(Context base) {
MultiLanguageUtil.getInstance().saveSystemCurrentLanguage(base);
super.attachBaseContext(MultiLanguageUtil.attachBaseContext(base));
//app刚启动getApplicationContext()为空
MultiLanguageUtil.getInstance().setConfiguration(getApplicationContext());
}
留言
为什么appcompat:1.2.0会导致多语言设置失效,这其中肯定还有更深层的原因,本人才疏学浅、业务繁多,既无能力、亦无精力深讨此问题根本原因。希望能有高人有幸看到此贴,若是不嫌弃,还请留言指点。
网友评论