为什么Android有自己的方式来获取当前的语言环境?

时间:2012-05-18 18:17:03

标签: android locale

此处的Android文档http://developer.android.com/guide/topics/resources/localization.html说明您可以使用此方法获取当前区域设置:

context.getResources().getConfiguration().locale

似乎Java已经以这种方法的形式提供了这些信息:

java.util.Locale.getDefault()

那么为什么Android开发人员会介绍另一种获取语言环境的方法呢?当同时并行运行时,上面两行代码会产生不同的结果吗?

1 个答案:

答案 0 :(得分:28)

我同意这是令人困惑的,虽然我没有攻击它,也没有我在捍卫它,我可以看到它允许你做一些事情。

让我们从头开始。

java.util.Locale.getDefault()由java运行时定义。它是手机/设备的区域设置。当没有语言环境时,它可以支持DateFormats(ISO Dateformat标准,美国格式标准等),NumberFormats(逗号或小数,3或4的分组等)和CurrenyFormats(看起来像$或CAD)。给出。对于这些情况,最好将Locale指定为这些类型的对象。

context.getResources().getConfiguration().locale是在给定上下文中向当前资源包注册的区域设置。它可以包括所有资源内容将遵循当前上下文/资源对的区域设置值。配置可以类似于最佳过滤到当前资源的设备的当前状态。您不一定需要根据区域设置指定任何更改的内容,但这是一个选项。

资源在Configuration中使用一组鉴别器,如方向,屏幕宽度,区域设置等。因此,在您的应用程序中,您可以通过仅将区域设置应用程序配置更改为其他区域设置来覆盖当前的Resources()。例如,您正在为地址制作布局。您可能希望某些字段根据所选国家/地区的变化而变形。 (对于这样的应用程序,这并不是说这是正确的行为,但现在最简单的想法)。如果你不得不简单地依赖Locale.getDefault(),那么当你想要按照我刚刚描述的方式做某些事情时,它会使系统应用程序和状态的某些尴尬重置。

您基本上需要修改整个设备的Locale(这不一定是安全的,也不是任何老用户会喜欢的)。即使我们忽视安全管理器会被主机vm复制的问题;在大多数设备上,有很多状态是为国家/地区套件缓存的。因此,在将此值转换为(如果任何人都可以这样做)时,会出现相当大的滞后并且可能存在很多不稳定性。另一种选择是始终指定所有内容的区域设置。你可以看到它会有多烦人。所以它在Context的配置中。

因此,虽然它很尴尬,但确实提供了额外的自由度和保护,以及便利性。大多数情况下,它将是Locale.getDefault(),因为您的应用程序是从基本上下文初始化为Locale.getDefault()的进程启动的。一般来说,我会回避过多使用Locale.getDefault()值。消费者应用程序开发中没有太多次可以信任它。

同样不是基于事实,因为我不是OS开发人员,只是主要基于分析系统的优缺点。我认为配置中的语言环境是完全合理的。