web-dev-qa-db-ja.com

ロケールの変更:アクティビティにリソースの再読み込みを強制しますか?

アプリケーションに言語設定があります。言語が切り替わったら、すべてのテキストビューなどですぐに言語を変えて欲しいです。現在、構成のロケールを変更しているだけなので、ユーザーがアクティビティを再開すると言語が変更されます。

私の問題に対する醜い解決策は、言語が変更されるたびに各テキストビューに新しいリソースをロードさせることです。より良い解決策はありますか?おそらく、アクティビティを個別に再開するためのきちんとした方法でしょうか?または、リソースを強制的にリロードするだけですか?

27
pgsandstrom

AndroidManifest.xmlで、この属性をアクティビティに追加します

_Android:configChanges="locale"
_

アクティビティオーバーライドでonConfigurationChanged()

_@Override
public void onConfigurationChanged(Configuration newConfig) {
  // refresh your views here
  super.onConfigurationChanged(newConfig);
}
_

https://developer.Android.com/guide/topics/manifest/activity-element.html#config

17
Jim Blackler

問題は、アプリのランタイムで言語を切り替え、UIにローカライズされたメッセージを表示することだと思います。 Android:configChanges="locale"は、アプリの実行中に(デバイスの設定で)システムロケールが変更された場合はonConfigurationChangedを呼び出します。アプリのコードでロケールを変更した場合は、実行しません。 。だからさわやかではありません。

9
MSquare

これは、必要に応じて、onCreate()またはonResume()のすべてのアクティビティで使用するメソッドです(ユーザーが言語設定を変更した後にアクティビティが再開する場合、または常に言語が設定された状態で作成される場合)。

そこから、ビューを手動で更新するか、このメソッドの終了後に呼び出されるonConfigurationChanged()から更新します。

public static void changeLocale(Activity activity, String language)
{
    final Resources res = activity.getResources();
    final Configuration conf = res.getConfiguration();
    if (language == null || language.length() == 0)
    {
        conf.locale = Locale.getDefault();
    }
    else
    {
        final int idx = language.indexOf('-');
        if (idx != -1)
        {
            final String[] split = language.split("-");
            conf.locale = new Locale(split[0], split[1].substring(1));
        }
        else
        {
            conf.locale = new Locale(language);
        }
    }

    res.updateConfiguration(conf, null);
}
7
3c71

これがonConfigurationChanged()で検出されない理由はわかりません。

ねえ、サンディス、あなたが言語を変更したときにメソッドonConfigurationChanged()があなたのアクティビティで呼び出されないということですか?同じ問題に遭遇しました。問題は多分これです:言語を変更すると、アクティビティはonDestroy()(これを試すことができます)に移動するため、onConfigurationChanged()を呼び出す人がいません。アクティビティを再度起動すると、onCreate()ではなくonConfigurationChanged()が呼び出されます。おそらく、ロケールの変更と方向の変更で異なるものがあります。

0
himalayagiant
public void settingLocale(Context context, String language) {

Locale locale;

Configuration config = new Configuration();

 if(language.equals(LANGUAGE_ENGLISH)) {

    locale = new Locale("en");

    Locale.setDefault(locale);

    config.locale = locale;

}else if(language.equals(LANGUAGE_ARABIC)){

    locale = new Locale("hi");

    Locale.setDefault(locale);

    config.locale = locale;

}

context.getResources().updateConfiguration(config, null);

// Here again set the text on view to reflect locale change

// and it will pick resource from new locale

tv1.setText(R.string.one); //tv1 is textview in my activity

}
0
ubhusri