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

Android获取系统语言环境的不同方法,android,locale,android-resources,android-configchanges,Android,Locale,Android Resources,Android Configchanges,所以,我发现有两种方法可以在Android中获取系统的语言环境: Locale.getDefault() 及 基本上,问题是——这两种产品的产量会不同吗?或者它们总是一样的,我可以使用第一个,因为它不需要Contextobject?Locale current=getResources().getConfiguration().Locale 您可能会发现,如果应用程序需要更改设置,则此值在更改设置后更新得更快 您的另一种方法中没有引用 注意默认的区域设置 请注意,有许多方便的方法可以自动使用默

所以,我发现有两种方法可以在Android中获取系统的语言环境:

Locale.getDefault()


基本上,问题是——这两种产品的产量会不同吗?或者它们总是一样的,我可以使用第一个,因为它不需要
Context
object?

Locale current=getResources().getConfiguration().Locale

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

您的另一种方法中没有引用

注意默认的区域设置

请注意,有许多方便的方法可以自动使用默认区域设置,但是使用它们可能会导致一些微妙的错误

默认区域设置适用于涉及向用户呈现数据的任务。在本例中,您希望使用用户的日期/时间格式、数字格式、转换为小写的规则等。在这种情况下,使用方便的方法是安全的

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

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

例如,如果要格式化整数,某些地区将使用非ASCII十进制数字。另一个例子是,如果要格式化浮点数,某些地区将使用“,”作为小数点,使用“.”进行数字分组。这对于人类可读的输出是正确的,但如果提交给另一台计算机,则可能会导致问题(例如,parseDouble(String)无法解析这样的数字)。您还应该警惕不采用区域设置的toLowerCase()和toUpperCase()重载:例如,在土耳其,字符“i”和“i”不会转换为“i”和“i”。这是土耳其语文本(如用户输入)的正确行为,但不适用于HTTP头


好的,您可以使用其中一种,除非您的应用程序本身使用一种方式而不是另一种方式篡改语言环境(
locale.setDefault()
但不使用
config.locale
,反之亦然)

原因如下:

:

getResources().getConfiguration().locale
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();
    ...