web-dev-qa-db-ja.com

現在のロケール(APIレベル24)を取得する方法は?

私はこのようにしていました:

context.getResources().getConfiguration().locale

Configuration.locale は、ターゲットが24の場合は推奨されません。したがって、この変更を行いました。

context.getResources().getConfiguration().getLocales().get(0)

今ではminSdkVersion 24専用であると言われているので、最小ターゲットが低いため使用できません。

適切な方法は何ですか?

17
user3290180

実行しているバージョンを確認し、非推奨のソリューションにフォールバックします。

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
    locale = context.getResources().getConfiguration().locale;
}
47
Egor

Locale.getDefault()を使用できます。これは、Java現在のLocaleを取得する標準的な方法です。

6

Configuration.Java、 有る:

/**
 * ...
 * @deprecated Do not set or read this directly. Use {@link #getLocales()} and
 * {@link #setLocales(LocaleList)}. If only the primary locale is needed,
 * <code>getLocales().get(0)</code> is now the preferred accessor.
 */
@Deprecated public Locale locale;
...
configOut.mLocaleList = LocaleList.forLanguageTags(localesStr);
configOut.locale = configOut.mLocaleList.get(0);

したがって、基本的にlocaleを使用すると、基本的にユーザーが設定したprimaryロケールを返します。受け入れの答えは、localeを直接読み取ることとまったく同じです。

ただし、このロケールは、リソースを取得するときに使用されるロケールとは限りません。プライマリロケールが利用できない場合、ユーザーのセカンダリロケールである可能性があります。

より正しいバージョンは次のとおりです。

Resources resources = context.getResources();
Locale locale = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
        ? resources.getConfiguration().getLocales()
            .getFirstMatch(resources.getAssets().getLocales())
        : resources.getConfiguration().locale;
2
Mygod