2

我已经看到了很多关于在堆栈溢出时检测暗模式的问题,访问了许多中型博客,例如如何知道您何时以编程方式使用暗模式DayNight — 向您的应用程序添加暗主题并在所有这些中执行像这样的支票:

fun isNightModeEnabled(context: Context): Boolean =
    context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) ==
            UI_MODE_NIGHT_YES

这适用于任何手机,甚至是运行 Android One 的小米手机,但不适用于运行 MIUI 的小米智能手机。

对于运行 MIUI 的小米设备:

context.resources.configuration.uiMode=17

context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK)=16

UI_MODE_NIGHT_YES (32)与启用或禁用暗模式时总是返回 false 相比。

是否真的可以检测到此类设备已强制使用暗模式?

4

2 回答 2

6

经过多次测试,我发现它只是在尝试禁用暗模式时失败:

AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)

在这种情况下,该方法错误地返回它不在暗模式下。所以我所做的是在应用程序主题上强制禁用暗模式:

<item name="android:forceDarkAllowed">false</item>

这确实停止了带有 MIUI 的设备的黑暗模式。

如果您不想禁用暗模式,那么通过前面提到的方式检测当前主题应该不会有问题:

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
}

这是文档中描述的那个

于 2021-01-07T16:52:51.293 回答
0

根据 Chris Banes 的文章,还有另一种方法。

设置模式(暗或亮):

AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES) // or MODE_NIGHT_NO or MODE_NIGHT_AUTO for system defaults

然后你可以只玩资源,黑暗或光明。不确定这种从上下文中检查暗模式的方式是否仍然适用。我没有那个信息。

按照上面的逻辑,检查应用程序是否处于暗模式:

if (AppCompatDelegate.getDefaultNightMode() == MODE_NIGHT_YES) //or other constants

AFAIK,默认的是MODE_NIGHT_NO

于 2020-12-29T22:05:55.283 回答