Android获取当前的Locale,而不是默认

Android get current Locale, not default

如何在Android中获取用户的当前区域设置?

我可以得到默认值,但这可能不是当前值,对吗?

基本上,我需要来自当前区域设置的两个字母的语言代码。不是默认的。没有Locale.current()


默认的Locale是在运行时根据系统属性设置为应用程序进程静态构造的,因此它将表示启动应用程序时在该设备上选择的Locale。通常情况下,这是可以的,但这确实意味着,如果用户在应用程序进程运行后在设置中更改其Locale,则getDefaultLocale()的值可能不会立即更新。

如果出于某种原因需要在应用程序中捕获这样的事件,您可以尝试从资源Configuration对象获取可用的Locale,即

1
Locale current = getResources().getConfiguration().locale;

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


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;
        }
    }


如果您使用的是Android支持库,则可以使用ConfigurationCompat而不是@makallee的方法来消除折旧警告:

1
Locale current = ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);

或者在Kotlin:

1
val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[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.

好像你应该用一下。


4