Locale.getDefault()与getResources().getConfiguration().getLocales().get(0)工作机制探究
应用Locale相关问题
基础配置
- 基于Java 11开发,最低兼容API 29,目标API 30(Android 11)
- 支持德语(默认)、英语两种语言,
app/build.gradle中配置resConfigs("de", "en"),对应语言的strings.xml翻译文件齐全
Locale获取方法测试
根据官方文档,Locale.getDefault()返回JVM实例的默认Locale;getResources().getConfiguration().getLocales()是官方推荐的Locale列表获取方式,论坛有说法称后者也能返回当前应用Locale。为验证,执行测试代码:
Log.d(TAG,"1="+Locale.getDefault()+", 2="+getResources().getConfiguration().getLocales().get(0));
测试结果
- 模拟器设置为“English (US)”:输出
1=en_US, 2=en_US,应用正确加载英语 - 模拟器设置为“German (CH)”:输出
1=de_CH, 2=de_CH,应用正确加载德语 - 模拟器设置为“German + English (US)”:输出
1=de_CH, 2=de_CH,应用正确加载德语 - 模拟器设置为“Danish + German (CH)”:输出
1=de_CH, 2=de_CH,应用正确加载德语 - 模拟器设置为“Danish + English (US)”:输出
1=en_US, 2=en_US,应用正确加载英语 - 模拟器设置为“Danish + Italian”:输出
1=da_DK, 2=da_DK,但应用实际加载德语(默认) - 模拟器设置为“Italian + Spanish”:输出
1=it_IT, 2=it_IT,但应用实际加载德语(默认)
可见两个方法的返回值要么是系统设置中应用支持的语言,要么是系统首选的第一个语言(即便应用不支持),与应用实际加载的默认语言不符。
语言切换后的异常表现
应用内有语言切换下拉选择器,调用Locale.setDefault(Locale.English)可立即将界面切换为英语,但跳转Activity后出现异常:
- 初始系统设置为“German + English (US)”:自动选择德语,输出
1=de_CH, 2=de_CH→切换为英语后界面变为英文→跳转Activity,在onCreateView中输出1=de_CH, 2=en,但所有界面元素仍为英语 - 初始系统设置为“Danish + Italian”:切换为英语后跳转Activity,输出
1=da_DK, 2=en,界面仍保持英文
核心疑问
- 为何
Locale.getDefault()会在跳转Activity后被重置? - 为何测试中两个方法的返回值与应用实际使用的Locale不一致?
- 如何可靠获取应用实际使用的Locale?
Locale.getDefault()和getResources().getConfiguration().getLocales()的实际工作机制是什么?是否存在Bug?
官方文档仅说明应用启动时的Locale选择逻辑,且Android 13及以上版本的语言偏好变更说明未覆盖上述问题。
内容的提问来源于stack exchange,提问作者Neph
相关产品推荐
相关产品推荐

