Настройка Android Nightmode меняет язык ресурса

Это эффект, который сложно описать.

Наше приложение для Android поддерживает два языка, однако мы не используем системный язык, но позволяем пользователю установить его в настройках. Затем перед присоединением BaseContext приложения мы устанавливаем конфигурацию локали.

// in Application class
override fun attachBaseContext(base: Context) {
   super.attachBaseContext(LocaleHelper.onAttach(base))
}

// the LocaleHelper
fun onAttach(context: Context): Context {
   return setLocale(context, getPersistedLanguage(context), getPersistedCountry(context))
}

Таким образом, вызов attachBaseContext получает контекст, для которого установлен языковой стандарт, например. «de» вместо «en» - даже если устройство на английском языке.

Пока это отлично работает, и в зависимости от настроек все ресурсы, поступающие из контекста, находятся на этом языке. Однако теперь мы добавили еще одну настройку для ночного режима (т.е. предоставили пользователю возможность установить «тему» ​​в «нормальном» или «темном режиме»).

По этой причине идея заключалась в том, чтобы установить что-то вроде этого

if (enableDarkMode) {
  AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
  AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}

в onCreate () приложения (мы также пробовали в Activity).

Однако при этом внезапно загружаются ресурсы (по крайней мере, некоторые) с локалью устройства. Пункты меню на языке устройства. Однако проверка Locale.getLanguage () дает мне настроенный язык и динамически вызываемые строки (например, context.getString (R.string.xyz)) также отображаются на правильно настроенном языке.

Это приводит к предположению, что ресурсы меню несколько (повторно) загружены (снова), но не соблюдают установленный языковой стандарт из JVM.

Кто-нибудь знает, как найти эту ошибку? Что нам здесь не хватает? Ресурсы меню загружаются по-другому?


person Tobias Reich    schedule 17.10.2019    source источник


Ответы (2)


Я только что обнаружил хакерское решение, но если у кого-то есть такая же проблема, это может немного помочь:

Я добавил к активности в манифесте

android:configChanges="uiMode"

указание приложению «самостоятельно обрабатывать изменения режима пользовательского интерфейса». В этом случае ресурсы остаются «нетронутыми», но я не уверен, какие еще последствия может иметь это изменение.

Пожалуйста, дайте мне знать, если у вас есть какие-либо намеки на то, что происходит не так, когда система / приложение разрешают самой системе / приложению обрабатывать изменения ночного режима.

person Tobias Reich    schedule 17.10.2019

Может быть, поздно, но это может помочь другим.

Удалось убедиться, что темная тема не меняет язык локали.

Для этого у меня есть фрагмент, который позволяет переключить темную тему.

Настройки Фрагмент:

switchPreference.setOnPreferenceChangeListener((preference, isSwitchOn) -> {
            if((boolean) isSwitchOn){
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
            return true;
        });

Затем в родительском действии мне просто нужно переопределить attachBaseContext!

SettingActivity:

@Override
    protected void attachBaseContext(Context newBase) {

        // Get configuration and resources before onCreate method
        Resources resources = newBase.getResources();
        Configuration configuration = new Configuration(resources.getConfiguration());
        configuration.uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
        Context context = newBase.createConfigurationContext(configuration);

        // Set locale with configuration saved
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        String langue = sharedPreferences.getString("langage_pref", "fr");
        Locale locale = new Locale(langue);
        Locale.setDefault(locale);
        configuration.setLocale(locale);
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        super.attachBaseContext(newBase);
    }

Надеюсь, это вам поможет! : D

person LelouchXV    schedule 25.05.2021