美文网首页
记录Android国际化语言适配部分页面不生效的问题

记录Android国际化语言适配部分页面不生效的问题

作者: 晖仔Milo | 来源:发表于2022-05-31 10:30 被阅读0次

问题描述

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会导致多语言设置失效,这其中肯定还有更深层的原因,本人才疏学浅、业务繁多,既无能力、亦无精力深讨此问题根本原因。希望能有高人有幸看到此贴,若是不嫌弃,还请留言指点。

相关文章

网友评论

      本文标题:记录Android国际化语言适配部分页面不生效的问题

      本文链接:https://www.haomeiwen.com/subject/rhczprtx.html