1

アプリケーションの言語を変更する方法 (構成を更新する方法) は既に知っています。私のコードは、システムによって構成が変更されているかどうかも確認し、「onCreate」メソッドで「修正」します。私は ListPreference を作成して、アプリがサポートする言語をユーザーが決定できるようにしました (そして決定を保存します)。

3 つのアクティビティ (A、B、および SettingsActivity) があるとします。アクティビティ A は、アクティビティ B と SettingsActivity を開始できます。アクティビティ B は SettingsActivity を開始できます。ユーザーが SettingsActivity 内の言語を変更した場合、次のコードを使用して問題なくリソース (この場合は文字列) を更新できます。

//if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) {
// Disabled because it blinks and looks bad
// recreate();
// } else {
    startActivity(getIntent());
    finish();
    overridePendingTransition(0, 0);
// }

ただし、SettingsActivity からの参照がないため、既に開いているアクティビティを変更することはできません。

私の質問: リソースを更新したり、既に開いているアクティビティを再作成したりするクリーンな方法はありますか? より良い解決策が見つからない場合、私のアプローチは上記のいずれかになります。

  1. を使用してアクティビティを開始startActivityForResultし、アクティビティを再作成するために既に使用しているコードをトリガーするコードを返します。
  2. onResume現在の言語が変更されているかどうかをメソッド内で確認し、同じことを行います。
4

1 に答える 1

0

最後に私がしたことはこれでした:

@Override
protected void onStart() {
    super.onStart();
    if (!locale.equals(getResources().getConfiguration().locale)) {
        finish();
        startActivity(getIntent());
        overridePendingTransition(0, 0);
        return;
    }
}

私のメソッドlocaleで割り当てられた変数はどこにありますか:onCreate

private Locale locale;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ((Application) getApplication()).refreshLanguage();
    locale = getResources().getConfiguration().locale;
    setContentView(R.layout.activity_main);
    //moar code
}

最後に、コードを投稿するために、ここに私のrefreshLanguageメソッドを示します。

boolean refreshLanguage() {
    return refreshLanguage(PreferenceManager.getDefaultSharedPreferences(this));
}

boolean refreshLanguage(SharedPreferences sharedPreferences) {
    if (sharedPreferences.contains("language")) {
        int languageIndex = Integer.parseInt(sharedPreferences.getString("language", "0"));
        if (!getResources().getConfiguration().locale.equals(languages[languageIndex])) {
            Configuration config = new Configuration();
            config.locale = languages[languageIndex];
            getResources().updateConfiguration(config, null);
            return true;
        }
    }
    return false;
}

トランスペアレント アクティビティ間を切り替えたり、ダイアログを使用したりしていないためではonStartなく、を使用していることに注意してください。onResume

于 2013-11-28T19:57:51.720 に答える