Система слежения за ночным режимом Android работает некорректно

Я реализовал темную тему, используя темы материалов DayNight в своем приложении. Я следил за несколькими статьями и выступлениями на конференциях в Интернете. Все шло хорошо, пока не начали происходить какие-то мелочи. Позволь мне объяснить:

В приложении есть несколько действий. Чтобы явно не тематизировать каждое действие, я последовал совету поместить начальную настройку темы в метод onCreate() моего приложения. Однако у этого есть один недостаток, который я объясню позже.

1.) AppCompat реализует ночной режим на уровне активности, что означает, что он не будет обновлять контекст приложения (который я использую для настройки приложения темы в целом) (источник: https://issuetracker.google.com/issues/134379747)

2.) Следующий фрагмент кода рекомендуется для проверки того, работает ли приложение в каком режиме. Но в моем случае он возвращает прямо противоположный режим:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}

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

Что я делаю неправильно? Может ли возможное решение установить тему на уровне активности?

2 ответа

Решение

В папке ресурсов вы можете добавить bools.xml в папку value_night с помощью кода ниже

<resources>
    <bool name="is_night_mode">true</bool>
</resources>

введите описание изображения здесь

и в папке по умолчанию сделать false

  <resources>
        <bool name="is_night_mode">false</bool>
    </resources>

введите описание изображения здесь

и в файле класса доступ к нему как Boolean isNightTheme = context.getResources().getBoolean(R.bool.preferences_autoplay);

Надеюсь, это поможет.

            when (resources.configuration.uiMode.and(Configuration.UI_MODE_NIGHT_MASK)) {
                Configuration.UI_MODE_NIGHT_NO -> themeLight.isChecked = true
                Configuration.UI_MODE_NIGHT_YES -> themeDark.isChecked = true
                Configuration.UI_MODE_NIGHT_UNDEFINED -> themeLight.isChecked = true
            }

используйте приведенный выше код, чтобы получить текущую тему. Чтобы мгновенно сменить тему, вам нужно добавить

 AppCompatDelegate.setDefaultNightMode(themeMode)
Другие вопросы по тегам