Android获取系统语言环境的不同方法

5

我发现在Android中获取系统语言有两种方法:

Locale.getDefault()

而且
getResources().getConfiguration().locale

基本问题是:这两个输出是否有所不同?或者它们总是相同的,我可以使用第一个,因为它不需要Context对象吗?
3个回答

1

当前语言环境 = getResources().getConfiguration().locale;

如果您的应用程序需要,您可能会发现此值在设置更改后更新得更快。

这不是您另一个方法中的内容。


1

引用自此页面:

小心使用默认语言环境

请注意,有许多方便的方法会自动使用默认语言环境,但使用它们可能会导致微妙的错误。

默认语言环境适用于涉及向用户呈现数据的任务。在这种情况下,您需要使用用户的日期/时间格式、数字格式、转换为小写字母的规则等。在这种情况下,使用方便的方法是安全的。

默认语言环境不适用于机器可读的输出。最佳选择通常是Locale.US-此语言环境保证在所有设备上都可用,并且它没有令人惊讶的特殊情况并且经常被使用(特别是用于计算机之间的通信),这意味着它往往是最有效的选择。

一个常见的错误是在生成用于机器可读的输出时隐式使用默认语言环境。这倾向于在开发人员的测试设备上工作(特别是因为许多开发人员使用en_US),但在运行在用户所在的更复杂的语言环境的设备上失败。

例如,如果您正在格式化整数,则某些语言环境将使用非ASCII十进制数字。另一个例子是,如果您正在格式化浮点数,则某些语言环境将使用“,”作为小数点,“。”用于数字分组。这对于人类可读的输出是正确的,但如果呈现给另一台计算机,则可能会导致问题(例如,parseDouble(String)无法解析此类数字)。您还应该注意不带Locale的toLowerCase()和toUpperCase()重载:例如,在土耳其,字符“i”和“I”不会转换为“I”和“i”。这是土耳其文本(例如用户输入)的正确行为,但不适用于HTTP标头。


0
据我所知,您可以使用任何一种方式,除非您的应用程序本身使用其中一种方式而不是另一种方式来篡改区域设置(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();
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接