Android:使用 AppCompatDelegate 检测夜间模式是否设置为 FOLLOW_SYSTEM
Android: Detect if night mode is set to FOLLOW_SYSTEM with AppCompatDelegate
我正在尝试创建一个设置选项,允许用户选择应用程序是否应处于夜间模式、白天模式或遵循系统默认设置。为了向用户显示当前设置,我需要从系统中获取它。但是我在下面使用的代码总是 returns MODE_NIGHT_UNSPECIFIED
。我是不是做错了什么?
我有以下代码:
val x = AppCompatDelegate.getDefaultNightMode()
when (x) {
AppCompatDelegate.MODE_NIGHT_NO -> {"testsadflke- MODE_NIGHT_NO".log()}
AppCompatDelegate.MODE_NIGHT_YES -> {"testsadflke- MODE_NIGHT_YES".log()}
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY -> {"testsadflke- MODE_NIGHT_AUTO_BATTERY".log()}
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM -> {"testsadflke- MODE_NIGHT_FOLLOW_SYSTEM".log()}
AppCompatDelegate.MODE_NIGHT_UNSPECIFIED -> {"testsadflke- MODE_NIGHT_UNSPECIFIED".log()}
}
日志输出为:
2020-07-01 21:47:08.751 6783-6783/com.example.macrotracker D/(AnyExt.kt:6)log(): Object: testsadflke- MODE_NIGHT_UNSPECIFIED
但是我认为这是不正确的,因为我的 appTheme 扩展了 material DayNight 主题。此外,当我启用或禁用夜间模式时,我的应用程序会更改主题,因此它必须遵循系统模式。任何帮助将不胜感激!
AppCompat 的夜间模式支持分为两层:
- “默认”层 - 由
setDefaultNightMode()
控制,通过 getDefaultNightMode()
读取
- “本地”层 - 由
setLocalNightMode()
控制,通过 getLocalNightMode()
读取
“默认”层仅在您未通过显式调用 setLocalNightMode()
设置本地模式(即 getLocalNightMode()
returns MODE_NIGHT_UNSPECIFIED
不同的值。
出于类似的原因,如果您从未调用过 setDefaultNightMode()
,那么 getDefaultNightMode()
预计会 return MODE_NIGHT_UNSPECIFIED
- 未指定意味着您尚未设置它到任何特定值。
重要的是要注意 AppCompatDelegate
不会保留您设置的任何值 - 您需要在每次创建应用程序时调用 setDefaultNightMode()
(即恢复您想要/拥有的任何值previous 在进程死亡后保存了自己)和 setLocalNightMode()
(如果你在特定的 Activity/Dialog 上使用它)在创建该组件时。
根据 MODE_NIGHT_UNSPECIFIED
documentation:
If both the default and local night modes are set to this value [MODE_NIGHT_UNSPECIFIED
], then the default value of MODE_NIGHT_FOLLOW_SYSTEM
is applied.
因此,如果您根本不使用本地模式,那么您可以将 MODE_NIGHT_UNSPECIFIED
视为与 MODE_NIGHT_FOLLOW_SYSTEM
相同,因为这正是 AppCompat 在两者都是 [= 的情况下所做的15=].
我正在尝试创建一个设置选项,允许用户选择应用程序是否应处于夜间模式、白天模式或遵循系统默认设置。为了向用户显示当前设置,我需要从系统中获取它。但是我在下面使用的代码总是 returns MODE_NIGHT_UNSPECIFIED
。我是不是做错了什么?
我有以下代码:
val x = AppCompatDelegate.getDefaultNightMode()
when (x) {
AppCompatDelegate.MODE_NIGHT_NO -> {"testsadflke- MODE_NIGHT_NO".log()}
AppCompatDelegate.MODE_NIGHT_YES -> {"testsadflke- MODE_NIGHT_YES".log()}
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY -> {"testsadflke- MODE_NIGHT_AUTO_BATTERY".log()}
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM -> {"testsadflke- MODE_NIGHT_FOLLOW_SYSTEM".log()}
AppCompatDelegate.MODE_NIGHT_UNSPECIFIED -> {"testsadflke- MODE_NIGHT_UNSPECIFIED".log()}
}
日志输出为:
2020-07-01 21:47:08.751 6783-6783/com.example.macrotracker D/(AnyExt.kt:6)log(): Object: testsadflke- MODE_NIGHT_UNSPECIFIED
但是我认为这是不正确的,因为我的 appTheme 扩展了 material DayNight 主题。此外,当我启用或禁用夜间模式时,我的应用程序会更改主题,因此它必须遵循系统模式。任何帮助将不胜感激!
AppCompat 的夜间模式支持分为两层:
- “默认”层 - 由
setDefaultNightMode()
控制,通过getDefaultNightMode()
读取
- “本地”层 - 由
setLocalNightMode()
控制,通过getLocalNightMode()
读取
“默认”层仅在您未通过显式调用 setLocalNightMode()
设置本地模式(即 getLocalNightMode()
returns MODE_NIGHT_UNSPECIFIED
不同的值。
出于类似的原因,如果您从未调用过 setDefaultNightMode()
,那么 getDefaultNightMode()
预计会 return MODE_NIGHT_UNSPECIFIED
- 未指定意味着您尚未设置它到任何特定值。
重要的是要注意 AppCompatDelegate
不会保留您设置的任何值 - 您需要在每次创建应用程序时调用 setDefaultNightMode()
(即恢复您想要/拥有的任何值previous 在进程死亡后保存了自己)和 setLocalNightMode()
(如果你在特定的 Activity/Dialog 上使用它)在创建该组件时。
根据 MODE_NIGHT_UNSPECIFIED
documentation:
If both the default and local night modes are set to this value [
MODE_NIGHT_UNSPECIFIED
], then the default value ofMODE_NIGHT_FOLLOW_SYSTEM
is applied.
因此,如果您根本不使用本地模式,那么您可以将 MODE_NIGHT_UNSPECIFIED
视为与 MODE_NIGHT_FOLLOW_SYSTEM
相同,因为这正是 AppCompat 在两者都是 [= 的情况下所做的15=].