Как я могу программно определить, находится ли устройство Android в темном режиме?

Я пытаюсь поддерживать тему Android Q Dark для своего приложения для Android, и я не могу понять, как импортировать различные ресурсы на основе темы, в которой я сейчас использую.

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

Я хотел сделать что-то подобное, где в зависимости от темы загружался либо актив «priceTag_light.png», либо «priceTag_dark.png».

val inputStream = if(darkIsEnabled) { 
                    assets.open("priceTag_dark.png")
                  } else {
                    assets.open("priceTag_light.png")
                  }

Есть ли способ получить этот флаг?


person Izadi Egizabal    schedule 28.08.2019    source источник


Ответы (3)


Хорошо, наконец-то нашел решение, которое искал. Как указывает @ deepak-s-gavkar, параметр, который дает нам эту информацию, находится в Конфигурации. Итак, после небольшого поиска я нашел эту статью, в которой приводится этот пример метода. это отлично сработало для того, что я хотел:

fun isDarkTheme(activity: Activity): Boolean {
        return activity.resources.configuration.uiMode and
                Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
    }
person Izadi Egizabal    schedule 28.08.2019
comment
Вы также можете использовать Context вместо Activity, чтобы упростить использование: ·) - person Roc Boronat; 17.02.2020
comment
fun Context.isDarkTheme (): Boolean {return resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES} - person Frank; 30.03.2020

Сначала вам нужно внести эти изменения в манифест

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />

затем onConfigurationChanged активности

val currentNightMode = resources.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
}
person Deepak S. Gavkar    schedule 28.08.2019
comment
Он хочет знать, включен ли темный режим, который есть в Android Q. - person Deepak S. Gavkar; 28.08.2019
comment
Это было не совсем то, что я хотел, так как я хотел проверить во время запуска, а не когда было произведено изменение. Но он указал мне правильное направление и нашел то, что я искал. Спасибо! - person Izadi Egizabal; 28.08.2019
comment
Зачем нужно устанавливать для uiMode значение configChanges? - person Emi Raz; 22.06.2020

Используйте следующий код:

boolean isDarkThemeOn = (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)  == Configuration.UI_MODE_NIGHT_YES;
person tsik    schedule 06.03.2021