最近我参与开发的一个应用在适配过程中发现一个问题:系统语言切换后,应用内大部分页面正常更新,但少数页面的部分文字仍显示旧语言,且并非每次切换都必现。
首先检查了 res/values/strings.xml(默认语言)和 res/values-zh/strings.xml(中文)等资源文件,确认多语言资源配置完整且无遗漏。
在 Android 中,语言切换通常会触发 Activity 的销毁与重建,从而重新加载资源。检查 AndroidManifest.xml 中相关 Activity 的 configChanges 属性,确认其未包含 locale,因此理论上应正常重建。
添加日志后确认 onCreate 确实重新执行,但问题依然存在,排除 Activity 层面的问题
继续排查发现,受影响的页面多为 Fragment 承载。查看 Fragment 的 onCreate 或 onCreateView 方法,发现其布局加载方式如下:
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.