如何在程序中检测Android设备是否处于暗黑模式?

22

我正在尝试为我的Android应用程序支持Android Q暗黑主题,但我无法弄清楚如何根据当前所在的主题导入不同的资源。

我使用官方的DayNight主题来制作深色/浅色版本,对于可绘制对象,只需指向XML即可,它会根据启用的模式从values或values-night中选择正确的值。

我想做类似的事情,根据主题加载"priceTag_light.png"或"priceTag_dark.png"这两个资源之一。

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

有没有办法让我获得那个标志?

3个回答

29

好的,最终我找到了我要寻找的解决方案。正如@deepak-s-gavkar所指出的那样,提供给我们这些信息的参数在配置文件中。所以,在进行了一番小小的搜索之后,我发现了这篇文章,其中提供了这个示例方法,对于我想要的东西,它已经完美地起到了作用:

fun isDarkTheme(activity: Activity): Boolean {
        return activity.resources.configuration.uiMode and
                Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
    }

2
您也可以使用Context而不是Activity,使其更易于使用:·) - Roc Boronat
4
fun Context.isDarkTheme(): Boolean { return resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES }翻译:这段代码是用于判断当前主题是否为暗黑模式。如果是暗黑模式,返回true,否则返回false。 - Frank
如果要判断应用程序的暗模式设置是否设置为“跟随系统”,你该如何判断呢? - undefined

7

您需要先在清单文件中进行以下更改:

<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
}

他想知道Android Q的一个功能——暗黑模式是否已启用。 - Deepak S. Gavkar
这不完全是我想要的,因为我想在启动时间检查,而不是在产生更改时检查。但它指引了我正确的方向,找到了我想要的东西。谢谢! - Izadi Egizabal
1
为什么需要将uiMode设置为configChanges? - Emad Razavi

6
请使用以下代码:
boolean isDarkThemeOn = (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)  == Configuration.UI_MODE_NIGHT_YES;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接