在miui(小米)中检测暗模式
Detect dark mode in miui (xiaomi)
我已经看到很多关于检测黑暗模式的问题,比如 on stack overflow and visited many medium blogs like How to know when you’re using dark mode programmatically and DayNight — Adding a dark theme to your app 并且在所有这些问题中,他们都执行这样的检查:
fun isNightModeEnabled(context: Context): Boolean =
context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) ==
UI_MODE_NIGHT_YES
这在任何 phone 甚至是 运行 Android 的小米手机中都很好用,但在 运行 的小米智能手机phone 上却不行] MIUI.
对于小米设备 运行ning MIUI:
context.resources.configuration.uiMode
= 17
和context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK)
= 16
与 UI_MODE_NIGHT_YES (32)
相比,在启用或禁用暗模式时总是 returns false。
是否真的可以检测到在此类设备上已强制执行深色模式?
根据 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
据我所知,默认的是MODE_NIGHT_NO
经过多次测试,我发现只有在尝试禁用暗模式时才会失败:
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
}
这是docs
中描述的那个
我已经看到很多关于检测黑暗模式的问题,比如
fun isNightModeEnabled(context: Context): Boolean =
context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK) ==
UI_MODE_NIGHT_YES
这在任何 phone 甚至是 运行 Android 的小米手机中都很好用,但在 运行 的小米智能手机phone 上却不行] MIUI.
对于小米设备 运行ning MIUI:
context.resources.configuration.uiMode
= 17
和context.resources.configuration.uiMode.and(UI_MODE_NIGHT_MASK)
= 16
与 UI_MODE_NIGHT_YES (32)
相比,在启用或禁用暗模式时总是 returns false。
是否真的可以检测到在此类设备上已强制执行深色模式?
根据 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
据我所知,默认的是MODE_NIGHT_NO
经过多次测试,我发现只有在尝试禁用暗模式时才会失败:
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
}
这是docs
中描述的那个