1

I'm trying to make a settings option that allows the user to choose whether the app should be in night mode, day mode or follow the system default. In order to display the current setting to the user I need to get it from the system. However the code I'm using below always returns MODE_NIGHT_UNSPECIFIED. Am I doing something wrong here?

I have the following code:

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

The log output is:

2020-07-01 21:47:08.751 6783-6783/com.example.macrotracker D/(AnyExt.kt:6)log(): Object: testsadflke-  MODE_NIGHT_UNSPECIFIED

However I think this is incorrect because my appTheme extends the material DayNight theme. Additionally, when I enable or disable night mode, my app changes theme, so it must be following the system mode. Any help would be much appreciated!

4

1 回答 1

3

AppCompat 的夜间模式支持分为两层:

  • “默认”层 - 由 控制setDefaultNightMode(),通过读取getDefaultNightMode()
  • “本地”层 - 由 控制setLocalNightMode(),通过读取getLocalNightMode()

“默认”层仅适用于您没有通过显式调用不同值来设置本地模式(即getLocalNightMode()返回)的情况。MODE_NIGHT_UNSPECIFIEDsetLocalNightMode()

出于类似的原因,如果您从未调用过setDefaultNightMode(),则getDefaultNightMode()预期会返回MODE_NIGHT_UNSPECIFIED- 未指定意味着您尚未将其设置为任何特定值。

重要的是要注意,AppCompatDelegate不会保留您设置的任何值 - 您需要在setDefaultNightMode()每次创建应用程序时调用(即,恢复您想要的任何值/在进程死亡后之前保存过自己)和setLocalNightMode()(如果您在特定的活动/对话框)创建该组件时。

根据MODE_NIGHT_UNSPECIFIED文档

如果默认和本地夜间模式都设置为此值 [ MODE_NIGHT_UNSPECIFIED],则MODE_NIGHT_FOLLOW_SYSTEM应用默认值 。

因此,如果您根本不使用本地模式,那么您可以将MODE_NIGHT_UNSPECIFIED其视为MODE_NIGHT_FOLLOW_SYSTEMAppCompat 在两者都是MODE_NIGHT_UNSPECIFIED.

于 2020-07-03T02:38:03.933 回答