Android get current Locale, not default
如何在Android中获取用户的当前区域设置?
我可以得到默认值,但这可能不是当前值,对吗?
基本上,我需要来自当前区域设置的两个字母的语言代码。不是默认的。没有Locale.current()。
- default()是一个相当安全的赌注,只是不要使用它进行处理(如文档所说)。
- @A--C用它来处理?
- 是的,请看文档中的说明:有些区域设置将使用","作为小数点,"."作为数字分组。所以parseInt()之类的东西可能会失败。请注意,他们仍然建议使用default(),但不能用于可能破坏代码的内容。
默认的Locale是在运行时根据系统属性设置为应用程序进程静态构造的,因此它将表示启动应用程序时在该设备上选择的Locale。通常情况下,这是可以的,但这确实意味着,如果用户在应用程序进程运行后在设置中更改其Locale,则getDefaultLocale()的值可能不会立即更新。
如果出于某种原因需要在应用程序中捕获这样的事件,您可以尝试从资源Configuration对象获取可用的Locale,即
1
| Locale current = getResources().getConfiguration().locale; |
如果您的应用程序需要更改设置,您可能会发现此值在更改设置后更新得更快。
- 假设我希望使用sharedreferences保存和恢复它,我该如何做?我所取回的和我所拥有的相比吗?
- 在系统中更改默认区域设置时,是否有人检查过应用程序中的默认区域设置没有更改?我认为它是那些"配置更改"中的一个,使活动被破坏并重新创建。
- 我测试了它,在不断改变区域设置的同时输出;结果是,输出是相同的。因此,locale.getdefault()可以安全地使用,因为它会被立即更新。Log.d("localeChange","Default locale lang:" + Locale.getDefault().getLanguage()); Log.d("localeChange","Config locale lang:" + getResources().getConfiguration().locale.getLanguage());
- 这在配置类中已被弃用,有关此建议,请参阅最新文档:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.。
- 为什么不添加一个getFirstLocale()方法来避免奇怪的getLocales().get(0)?
- 如果您想支持API的旧版本和新版本,该怎么办?
- 它还返回某些语言的错误值,例如nn_no总是作为列表中的下一个返回。
Android N(API 24级)更新(无警告):
1 2 3 4 5 6 7 8
| Locale getCurrentLocale(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
return context.getResources().getConfiguration().getLocales().get(0);
} else{
//noinspection deprecation
return context.getResources().getConfiguration().locale;
}
} |
- 支持库中是否有避免if-else的内容?
- @如果包含if和fallback代码,则代码中不需要targetapi(build.versioncodes.n)
- @federicoponzi no resourcecompat似乎在25.0.1之前没有区域设置方法。
- 如果用户安装了多种语言,这可能不起作用。您应该使用LocaleList.getDefault().get(0);,因为这将返回按首选语言排序的区域设置。
- @费德里科波尼@3st我在ConfigurationCompat中找到了这个,就像ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)一样。
- 如果使用ContextWrapper,我将传入baseContext。好代码。
如果您使用的是Android支持库,则可以使用ConfigurationCompat而不是@makallee的方法来消除折旧警告:
1
| Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0); |
或者在Kotlin:
1
| val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0] |
- 如果你没有任何上下文,你也可以做ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);。
来自getDefault的文件:
Returns the user's preferred locale. This may have been overridden for this process with setDefault(Locale).
也可从Locale文件中获得:
The default locale is appropriate for tasks that involve presenting data to the user.
好像你应该用一下。
- 这个答案是错误的,得到了一个默认的区域设置,但是如果用户在飞行中更改了它,它就会显示错误。下一个答案是正确的
- 同意,回答错误。在我的例子中,我正在寻找一种不必使用getresources()的方法,这意味着我需要一个上下文。我的问题是一个没有上下文的助手类,但我想我必须把它传递给。如果你有一个应用程序可以让人们改变他们的语言环境,改变视图的字符串、数字格式等,那么你需要使用devunwired的响应。
4
- 2016年发布的另一个答案已经包含了完全相同的代码片段。
- 见@elegyd answer,也写在2018年。