走向黑暗面:黑暗主题回顾
雅罗斯拉夫·别列赞斯基的官方文件
控制水平。向后兼容性
Dark Theme 有 3 个级别的控制:
- 系统设定
- 应用程序设置
- 活动设置
一、系统设置:
这是一个全局设置,由用户显式或隐式控制(通过切换省电模式)。
改变它的方法有限:
- Dark Theme Toggle (Settings->Display->Dark Theme) — 在 Android Q (API 29) 中引入;
- 夜间模式开发者选项(设置->系统->开发者选项->夜间模式)- 仅适用于 Android P (API 28)。
- 省电模式。向后兼容至 Android Lollipop (API 21)。一些 EOM 可能不支持这一点。
此设置应用于系统级别,包括所有系统 UI 和应用程序。更改设置后,您的应用程序将获得Application.onConfigurationChange回调,并立即重新创建所有活动。但是,取决于您的应用程序是否遵循它或用本地应用程序覆盖(应用程序或活动范围的设置)。
2.应用设置:
作为一个好公民,您可以让用户在您的应用程序内的主题之间进行选择(覆盖系统设置)。
它可以通过您的自定义小部件使用AppCompatDelegate.setDefaultNightMode API 进行控制(通常,它是设置屏幕中的 ListPreference)。
推荐的选项是:
- 光
- 黑暗的
- 由省电模式设置。它向后兼容 API 21(API 21–27 的推荐默认选项)
- 系统默认(API 28 及更高版本推荐的默认选项)
此外,您可以将 Light 设置为默认值,并将 API 的最后 2 个选项隐藏在 21 以下,因为它们都不支持。
每个选项都直接映射到 AppCompat.DayNight 模式之一:
- 光 — MODE_NIGHT_NO
- 黑暗 — MODE_NIGHT_YES
- 由省电模式设置 — MODE_NIGHT_AUTO_BATTERY
- 系统默认值 - MODE_NIGHT_FOLLOW_SYSTEM
更改设置后,将重新创建所有已启动的活动(或获取Activity.onConfigurationChange回调,如果您选择在清单中手动处理配置更改)。
3.活动设置:
它与应用程序设置非常相似,但仅适用于使用getDelegate().setLocalNightMode 的特定活动。请注意,它的任何调用都会触发活动重新创建(如果主题发生变化)。正如 Chris Banes在这里所建议的那样,您应该更喜欢AppCompatDelegate.setDefaultNightMode,因为它可以最大限度地减少不必要的娱乐。