1. ホーム
  2. android

Androidxへの移行後、ロケールの変更が効かない

2023-10-21 09:22:56

質問

私は多言語をサポートする古いプロジェクトを持っています。私はサポートライブラリとターゲットプラットフォームをアップグレードしたい。 に移行する前に Androidx に移行する前は、すべてうまくいっていたのですが、今は言語を変更してもうまくいきません。

私は、アプリのデフォルトロケールを変更するために、このコードを使用します。

private static Context updateResources(Context context, String language)
{
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);

    return context.createConfigurationContext(configuration);
}

そして、各アクティビティでこのメソッドをオーバーライドして呼び出します。 attachBaseContext のようにします。

@Override
protected void attachBaseContext(Context newBase)
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    String language = preferences.getString(SELECTED_LANGUAGE, "fa");
    super.attachBaseContext(updateResources(newBase, language));
}

他の方法で文字列を取得しようとしたところ、以下のことに気がつきました。 getActivity().getBaseContext().getString が動作し getActivity().getString は動作しません。以下のコードでもうまくいかず、常に app_name が表示されます。

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"/>

のサンプルコードを共有します。 https://github.com/Freydoonk/LanguageTest

また getActivity()..getResources().getIdentifier は動作せず、常に 0 を返します。

どのように解決するのですか?

最後に、私は自分のアプリで問題を見つけました。プロジェクトを Androidx に移行したところ、プロジェクトの依存関係がこのように変わってしまいました。

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.1.0-alpha04'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
} 

見ての通り androidx.appcompat:appcompat1.1.0-alpha03 に変更したところ、最新の安定版では 1.0.2 に変更したところ、私の問題は解決し、変更言語が正常に動作するようになりました。

私は、最新の安定版である appcompat ライブラリは Maven リポジトリ . また、他のライブラリも最新の安定版に変更しています。

これで、私のアプリの依存関係セクションは以下のようになります。

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}