将 DayNight 主题添加到应用程序

DayNight 主题为应用程序提供了基于一天中的时间和设备的最后已知位置来切换颜色方案的强大功能。

将以下内容添加到 styles.xml

<style name="AppTheme" parent="Theme.AppCompat.DayNight">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
</style>

你可以扩展为添加日夜主题切换功能的主题如下:

  • Theme.AppCompat.DayNight
  • Theme.AppCompat.DayNight.NoActionBar
  • Theme.AppCompat.DayNight.DarkActionBar

除了 colorPrimarycolorPrimaryDarkcolorAccent 之外,你还可以添加你想要切换的任何其他颜色,例如 textColorPrimarytextColorSecondary。你也可以将此应用的自定义颜色添加到此 style 中。

要使主题切换工作,你需要在 res/values 目录中定义默认的 colors.xml,在 res/values-night 目录中定义另一个 colors.xml,并相应地定义日/夜颜色。

要切换主题,请从 Java 代码中调用 AppCompatDelegate.setDefaultNightMode(int) 方法。 (这将改变整个应用程序的颜色方案,而不仅仅是任何一个活动或片段。)例如:

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

你可以根据你的选择通过以下三种中的任何一种:

  • AppCompatDelegate.MODE_NIGHT_NO:这将为你的应用设置默认主题,并采用 res/values 目录中定义的颜色。建议为此主题使用浅色。
  • AppCompatDelegate.MODE_NIGHT_YES:这会为你的应用设置夜间主题,并采用 res/values-night 目录中定义的颜色。建议在此主题中使用深色。
  • AppCompatDelegate.MODE_NIGHT_AUTO:这个自动根据一天中的时间和你在 valuesvalues-night 目录中定义的颜色切换应用程序的颜色。

也可以使用 getDefaultNightMode() 方法获得当前的夜间模式状态。例如:

int modeType = AppCompatDelegate.getDefaultNightMode();

但是,请注意,如果你终止应用程序并重新打开它,主题开关将不会保留。如果你这样做,主题将切换回 AppCompatDelegate.MODE_NIGHT_AUTO,这是默认值。如果你希望主题开关保持不变,请确保将值存储在共享首选项中,并在每次应用程序打开后加载存储的值。