問題描述
1、App內(nèi)切換語言(Demo:https://github.com/finddreams/AndroidMultiLanguage),并調(diào)用一下代碼重啟頁面
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亦渗,重新打開挖诸。神奇的一幕發(fā)生了,前面打開的幾個界面法精,都顯示的是系統(tǒng)默認語言多律。而且打印
getResources().getConfiguration().locale
得到的也確實是"zh"。
但同時搂蜓,之后打開的界面又都正確的顯示了修改的語言狼荞。
問題:
這就奇怪了,為什么是同一套代碼帮碰,app殺死重啟后的前幾個界面沒有渲染出我想要的語言呢相味?
解決:
我參考了別人的demo,發(fā)現(xiàn)別人的demo在我手機里運行是正常的殉挽,無論如何殺死app都不影響丰涉。這就奇怪了不是?所以斯碌,開始用排查法對比代碼一死。
開始分析
1、對比切換語言的代碼傻唾,我是直接copy的投慈,排除;
2冠骄、對比調(diào)用的代碼逛裤,Application、BaseActivity等關鍵位置一致猴抹,沒有問題带族,排除;
3蟀给、對比依賴蝙砌,發(fā)現(xiàn)我的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、發(fā)現(xiàn)無論如何重啟app响蕴,都可以從頭至尾正確的渲染出我想要的語言谆焊。
結(jié)論
1、這是系統(tǒng)庫appcompat的坑浦夷,如果你的項目也需要適配多語言辖试,建議使用1.3.0及以上版本。
補充
開篇分享的demo中劈狐,通過application.getString(R.string.xx)獲取的文案可能不會獲取到預期的字符串罐孝,需要在Application - attachBaseContext中做出一些調(diào)整,具體如下
@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會導致多語言設置失效肥缔,這其中肯定還有更深層的原因肾档,本人才疏學淺、業(yè)務繁多辫继,既無能力、亦無精力深討此問題根本原因俗慈。希望能有高人有幸看到此貼姑宽,若是不嫌棄,還請留言指點闺阱。