Android-локаль случайным образом изменяет свое значение по умолчанию

У меня есть одно действие и в 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());
}

У меня есть ViewPager с FragmentPagerAdapter и три вкладки на Android 2.3.7. проблема в том, что иногда при переключении вкладок локаль приложения возвращается на английский, так что теперь пользовательский интерфейс имеет смешанные языки. Я всегда создаю новые фрагменты для вкладок в методе getItem() адаптера. если я поворачиваю устройство, язык снова будет правильным.

Я также попытался поставить android: configChanges = "locale" в манифесте, а не переопределять onConfigurationChanged(), но результат тот же.

Хуже всего то, что он не воспроизводится на 100%, это происходит только несколько раз, и у меня также есть отчеты от пользователей об этом. как только приложение запустится, и оно не изменит языковой стандарт после переключения нескольких вкладок, то он будет правильно до выхода.

Ответ 1

Через некоторое время я понял путь. Единственное решение, которое работает для меня, всегда устанавливает локаль в основной Acitivity onCreate(), в каждом фрагменте onCreateView(), в onReceive() каждого BroadcastReceiver() (если он загружает некоторый ресурс) и в начале каждой службы. Для этого я сделал статический метод 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());
}