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=].