16

私には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%再現可能ではないということです、それはたまにしか起こりません、そして私はこれについてのユーザーからの報告もあります。アプリケーションが起動し、いくつかのタブを切り替えてもロケールが変更されない場合は、終了するまで正しく変更されます。

4

1 に答える 1

17

しばらくして、私は方法を見つけました。私にとって有効な唯一の解決策は、常にメインAcitivityのonCreate()、各フラグメントのonCreateView()、すべてのBroadcastReceiver()のonReceive()(リソースをロードする場合)、およびすべてのサービスの開始時にロケールを設定することです。このために、メインの唯一のアクティビティで静的メソッドsetLocale()を作成しました。さらにアクティビティがある場合は、カスタムアプリケーションクラスに配置できます。

最後に一つだけ。アプリをデバッグのためにIDEから直接起動すると、これでも機能しない場合があります。心配しないでください。デバイスで正常に実行されていれば(少なくとも私にとっては)機能します。

public static void setLocale(Context context) {
    final String lang = PreferenceManager.getDefaultSharedPreferences(context).getString("locale", "en");
    final Locale newLocale = new Locale(lang);
    Locale.setDefault(newLocale);
    final Configuration config = new Configuration();
    config.locale = newLocale;

    final Resources res = context.getResources();
    res.updateConfiguration(config, res.getDisplayMetrics());
}
于 2012-09-03T08:58:43.197 に答える