所以,我发现在Android中有两种获取系统区域设置的方法:
Locale.getDefault()
和
getResources().getConfiguration().locale
基本上问题是 - 这两个输出可以不同吗?或者它们总是一样,我可以使用第一个,因为它不需要Context
个对象?
答案 0 :(得分:1)
Locale current = getResources()。getConfiguration()。locale;
如果您的应用程序需要更改设置,您可能会发现更快地更新此值。
哪个不在你的另一种方法
答案 1 :(得分:1)
警惕默认语言环境
请注意,有许多便捷方法会自动使用默认语言环境,但使用它们可能会导致细微错误。
默认语言环境适用于涉及向用户显示数据的任务。在这种情况下,您希望使用用户的日期/时间格式,数字格式,转换为小写的规则等。在这种情况下,使用便捷方法是安全的。
默认语言环境不适合机器可读输出。最好的选择通常是Locale.US - 这个语言环境保证可以在所有设备上使用,并且它没有令人惊讶的特殊情况并经常使用(特别是用于计算机 - 计算机通信)这意味着它往往是最有效的选择。
一个常见的错误是在生成意味着机器可读的输出时隐式使用默认语言环境。这往往适用于开发人员的测试设备(特别是因为许多开发人员使用en_US),但在用户处于更复杂的语言环境的设备上运行时会失败。
例如,如果要格式化整数,某些区域设置将使用非ASCII十进制数字。另一个例子,如果你要格式化浮点数,一些语言环境将使用','作为小数点和'。'用于数字分组。这对于人类可读的输出是正确的,但如果呈现给另一台计算机可能会导致问题(例如,parseDouble(String)无法解析这样的数字)。您还应该警惕那些不采用Locale的toLowerCase()和toUpperCase()重载:例如,在土耳其,字符'i'和'I'将不会转换为'I'和'i ”。这是土耳其语文本(例如用户输入)的正确行为,但不适用于HTTP标头。
答案 2 :(得分:0)
AFAIK,你可以使用其中之一,除非你的应用本身使用一种方式而不是另一种方式篡改语言环境(Locale.setDefault()
但不是config.locale
,反之亦然)
这就是原因:
ResourcesManager.applyConfigurationToResourcesLocked() #275:
public final boolean applyConfigurationToResourcesLocked(Configuration config,
CompatibilityInfo compat)
...
// set it for java, this also affects newly created Resources
if (config.locale != null) {
Locale.setDefault(config.locale);
}
Resources.updateSystemConfiguration(config, defaultDisplayMetrics, compat);
ApplicationPackageManager.configurationChanged();
...