Android Система следования в ночном режиме работает некорректно - PullRequest
0 голосов
/ 25 мая 2020

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

В приложении есть несколько функций. Чтобы явно не тематизировать каждое действие, я последовал совету поместить начальную настройку темы в метод 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 ]

1 голос
/ 25 мая 2020

в папке ресурсов вы можете добавить 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);

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

0 голосов
/ 25 мая 2020
            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)
...