Android AppCompatDelegate.setDefaultNightMode не воссоздает родительское действие в android 9 - PullRequest
0 голосов
/ 09 февраля 2020

Здравствуйте. Я использую этот AppCompatDelegate для переключения между дневными и ночными темами. У меня есть 2 действия A & B, этот код вызывается из действия B, он должен воссоздать действие B & A с выбранным стилем. Вот мой код

  applyNight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
      if (!isNight) {

            SharedPrefrencesMethods.savePreferences(this, getString(R.string.night_key), true);

            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);


        } else {
            SharedPrefrencesMethods.savePreferences(this, getString(R.string.night_key), false);

            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

        }
            }
        });

Я тестировал его на android 7 & 6, он работает нормально, т.е. при изменении режима в упражнении B и нажатии на задание A, воссоздавая с новой темой. При попытке сделать это на android 9 он меняет только действие B и не влияет на родительское действие A.

1 Ответ

1 голос
/ 20 марта 2020

У меня тоже была эта проблема, а затем я воспользовался советом Криса Бейнса в официальном блоге Google Android Разработчики https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94, чтобы сначала установить setDefaultNightMode в классе приложения, поэтому я создал класс EcwgApplication, расширяющий Application, как он показывает, и добавил android:name=".EcwgApplication" в раздел application манифеста. Я также поместил свой метод переключения тем в класс приложения, который может вызывать моя активность по настройкам, когда пользователь изменяет настройку темы (в дополнение к обновлению SharedPreferences изменением перед вызовом), так что это выглядит так:

public class EcwgApplication extends Application {
    public void onCreate() {
        super.onCreate();

        int selectedDarkLightTheme = PreferenceManager.getDefaultSharedPreferences(this).getInt(getString(R.string.preferences_dark_light_mode_selected_key), AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
        AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
    }

    public static void setDarkLightTheme(int selectedDarkLightTheme) {
        AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
    }
}

Это прекрасно работало с Android версиями ОС с 24 по 29, но с 21 (самая низкая версия, поддерживаемая этим приложением) до 23 я получал черный экран при возвращении к первому действию и при вращении экран исправил бы это, он также дал понять, что состояние пользовательского интерфейса не было сохранено. Поэтому я изменил StartActivity для экрана «Настройки» на StartActivityForResult, и в onActivityResult проверил, номер версии <= 23, и если да, то <code>this.recreate().

Мне нужно продолжать проводить больше тестов, но, по крайней мере, пока все работает отлично.

...