Android 语言切换后部分页面未更新?可能是 Application Context 的问题

最近我参与开发的一个应用在适配过程中发现一个问题:系统语言切换后,应用内大部分页面正常更新,但少数页面的部分文字仍显示旧语言,且并非每次切换都必现。

首先检查了 res/values/strings.xml(默认语言)和 res/values-zh/strings.xml(中文)等资源文件,确认多语言资源配置完整且无遗漏。

在 Android 中,语言切换通常会触发 Activity 的销毁与重建,从而重新加载资源。检查 AndroidManifest.xml 中相关 Activity 的 configChanges 属性,确认其未包含 locale,因此理论上应正常重建。

添加日志后确认 onCreate 确实重新执行,但问题依然存在,排除 Activity 层面的问题

继续排查发现,受影响的页面多为 Fragment 承载。查看 Fragment 的 onCreateonCreateView 方法,发现其布局加载方式如下:

java 复制代码
mRootView = LayoutInflater.from(mAppContext).inflate(R.layout.fragment_layout, null);

其中 mAppContext 来自 getApplicationContext()。

LayoutInflater.from(Application) 所 inflate 出的 View,其内部持有的 Resources 引用指向 Application 的资源对象。而 Application 的 Resources 在系统语言切换后不会自动更新,这与 Activity 的 Resources 行为不同。

改成这样ok:

java 复制代码
mRootView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_layout, null);

另外,还是有TextView没有跟随系统语言切换,修改自定义Application的onConfigurationChanged方法:

java 复制代码
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // 强制刷新 Application 的 Resources 配置
    resources.updateConfiguration(newConfig, resources.displayMetrics)
}

测试ok.