私には1つのアクティビティがあり、onCreateで設定から言語をロードし、次のようなロケールを設定します。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
Locale newLocale = new Locale(lang);
Locale.setDefault(newLocale);
Configuration config = new Configuration();
config.locale = newLocale;
final Resources res = getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
}
onConfigurationChangedもオーバーライドします
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en");
Locale newLocale = new Locale(lang);
Locale.setDefault(newLocale);
Configuration config = new Configuration();
config.locale = newLocale;
final Resources res = getResources();
res.updateConfiguration(config, res.getDisplayMetrics());
}
私はAndroid2.3.7にFragmentPagerAdapterと3つのタブを備えたViewPagerを持っています。問題は、タブを切り替えるとアプリのロケールが英語に戻ることがあるため、UIの言語が混在することです。アダプターのgetItem()メソッドでタブの新しいフラグメントを常に作成します。デバイスを回転させると、ロケールは再び正しくなります。
また、android:configChanges = "locale"をマニフェストに入れて、onConfigurationChanged()をオーバーライドしないようにしましたが、結果は同じです。
最悪のことは、それが100%再現可能ではないということです、それはたまにしか起こりません、そして私はこれについてのユーザーからの報告もあります。アプリケーションが起動し、いくつかのタブを切り替えてもロケールが変更されない場合は、終了するまで正しく変更されます。