Android - Как определить, включен ли ночной режим при использовании AppCompatDelegate.MODE_NIGHT_AUTO

Я использую Androids, встроенный в функциональность дневного/ночного режима, и я хотел бы добавить опцию в мое приложение для AppCompatDelegate.MODE_NIGHT_AUTO

У меня проблема, потому что мое приложение требует, чтобы определенные вещи были окрашены программно, и я не могу понять, как проверить, считает ли приложение себя в ночном или дневном режиме. Без этого я не могу установить флаг для выбора правильных цветов.

Вызов AppCompatDelegate.getDefaultNightMode() просто возвращает AppCompatDelegate.MODE_NIGHT_AUTO, который бесполезен.

Я не вижу ничего другого, что скажет мне, но должно быть что-то?

Ответ 1

int nightModeFlags =
    getContext().getResources().getConfiguration().uiMode &
    Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
    case Configuration.UI_MODE_NIGHT_YES:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_NO:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_UNDEFINED:
         doStuff();
         break;
}

Ответ 2

Если вы разработчик Kotlin, вы можете использовать приведенный ниже код, чтобы судить о темном режиме.

 val mode = context?.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)
    when (mode) {
        Configuration.UI_MODE_NIGHT_YES -> {}
        Configuration.UI_MODE_NIGHT_NO -> {}
        Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
    }

Подробнее о режиме темной темы

https://github.com/googlesamples/android-DarkTheme/

Ответ 3

Побитовый оператор в Java (который используется в ответе @ephemient) отличается в kotlin, поэтому код не может быть легко конвертируемым для начинающих. Вот версия kotlin на всякий случай:

    private fun isUsingNightModeResources(): Boolean {
        return when (resources.configuration.uiMode and 
Configuration.UI_MODE_NIGHT_MASK) {
            Configuration.UI_MODE_NIGHT_YES -> true
            Configuration.UI_MODE_NIGHT_NO -> false
            Configuration.UI_MODE_NIGHT_UNDEFINED -> false
            else -> false
    }
}