背景
在最近的 Android 版本中,自 Android 8.1 以来,操作系统对主题的支持越来越多。更具体地说是黑暗主题。
问题
尽管从用户的角度来看有很多关于暗模式的讨论,但几乎没有为开发人员编写的内容。
我发现了什么
从 Android 8.1 开始,Google 提供了某种深色主题。如果用户选择深色壁纸,操作系统的某些 UI 组件会变黑(文章 here)。
此外,如果您开发了一个动态壁纸应用程序,您可以告诉操作系统它有哪些颜色(3 种颜色),这也会影响操作系统的颜色(至少在基于 Vanilla 的 ROM 和 Google 设备上)。这就是为什么我什至制作了一个应用程序,它可以让你拥有任何壁纸,同时仍然可以选择颜色 (here)。这是通过调用 notifyColorsChanged 来完成的。然后使用 onComputeColors 提供它们
从 Android 9.0 开始,现在可以选择要拥有的主题:浅色、深色或自动(基于壁纸):
而现在在临近的 Android Q 上,似乎又走得更远了,但还不清楚到什么程度。不知何故,一个名为“Smart Launcher”的启动器骑在上面,提供直接使用主题(文章here)。因此,如果您启用暗模式(手动,如 here 所写),您将获得应用程序的设置屏幕,如下所示:
到目前为止,我唯一发现的是上述文章,并且我正在关注此类主题。
我也知道如何请求操作系统使用动态壁纸更改颜色,但这似乎在 Android Q 上发生了变化,至少根据我在尝试时看到的情况(我认为它更多基于时间,但不确定)。
问题
最佳答案
Google 刚刚在 I/O 2019 结束时发布了关于黑暗主题的文档,here .
为了管理黑暗主题,您必须首先使用最新版本的 Material 组件库:"com.google.android.material:material:1.1.0-alpha06"
.
根据系统主题更改应用主题
应用程序根据系统切换到深色主题,只需要一个主题。为此,主题必须有 Theme.MaterialComponents.DayNight 作为父级。
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
...
</style>
确定当前系统主题
要知道系统当前是否处于黑暗主题,您可以实现以下代码:
switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {
case Configuration.UI_MODE_NIGHT_YES:
…
break;
case Configuration.UI_MODE_NIGHT_NO:
…
break;
}
收到主题更改通知
我认为不可能实现一个回调,以便在主题更改时得到通知,但这不是问题。实际上,当系统更改主题时, Activity 会自动重新创建。将前面的代码放在 Activity 的开头就足够了。
它适用于哪个版本的 Android SDK?
我无法让它在带有 Android SDK 版本 28 的 Android Pie 上工作。所以我假设这只适用于 SDK 的下一个版本,它将与 Q 版本 29 一起启动。
结果
关于android - 是否有 API 可以检测操作系统正在使用哪个主题 - 深色或浅色(或其他)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55787035/