web-dev-qa-db-ja.com

Androidは現在のロケールを取得します。デフォルトではありません

Androidでユーザーの現在のロケールを取得する方法

私はデフォルトのものを入手することができますが、これは現在のものではないかもしれません正しいですか?

基本的に私は現在のロケールからの2文字の言語コードが欲しいです。デフォルトではありません。 Locale.current()はありません

253
CQM

デフォルトのLocaleは、実行時にシステムプロパティ設定からアプリケーションプロセスに対して静的に構築されるため、アプリケーションの起動時にそのデバイスで選択されたLocaleを表します。通常はこれで問題ありませんが、アプリケーションプロセスの実行後にユーザーが設定でLocaleを変更しても、おそらくgetDefaultLocale()の値はすぐには更新されません。

アプリケーションで何らかの理由でこのようなイベントをトラップする必要がある場合は、代わりにリソースのLocaleオブジェクトから利用可能なConfigurationを取得してみてください。

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

アプリケーションに必要な場合は、設定変更後にこの値がより早く更新されることがあります。

445
Devunwired

Android N(Apiレベル24)アップデート(警告なし):

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

Android Support Libraryを使用している場合は、@ Makaleleのメソッドの代わりにConfigurationCompatを使用して廃止予定の警告を取り除くことができます。

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

またはコトリンで:

val currentLocale = ConfigurationCompat.getLocales(resources.configuration)[0]
32
ElegyD

getDefault のドキュメントから:

ユーザーの優先ロケールを返します。これはsetDefault(Locale)でこのプロセスに対して上書きされた可能性があります。

Localeのドキュメントからも:

デフォルトのロケールは、データをユーザーに提示することを含むタスクに適しています。

あなたはそれを使うべきだと思われます。

13
kabuko
 private Locale getLocale(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;
        }
    }
0
Vinayak