android - 是否有 API 可以检测操作系统正在使用哪个主题 - 深色或浅色(或其他)?

标签 android themes android-9.0-pie android-8.1-oreo android-10.0

背景

在最近的 Android 版本中,自 Android 8.1 以来,操作系统对主题的支持越来越多。更具体地说是黑暗主题。

问题

尽管从用户的角度来看有很多关于暗模式的讨论,但几乎没有为开发人员编写的内容。

我发现了什么

从 Android 8.1 开始,Google 提供了某种深色主题。如果用户选择深色壁纸,操作系统的某些 UI 组件会变黑(文章 here)。

此外,如果您开发了一个动态壁纸应用程序,您可以告诉操作系统它有哪些颜色(3 种颜色),这也会影响操作系统的颜色(至少在基于 Vanilla 的 ROM 和 Google 设备上)。这就是为什么我什至制作了一个应用程序,它可以让你拥有任何壁纸,同时仍然可以选择颜色 (here)。这是通过调用 notifyColorsChanged 来完成的。然后使用 onComputeColors 提供它们

从 Android 9.0 开始,现在可以选择要拥有的主题:浅色、深色或自动(基于壁纸):

enter image description here

而现在在临近的 Android Q 上,似乎又走得更远了,但还不清楚到什么程度。不知何故,一个名为“Smart Launcher”的启动器骑在上面,提供直接使用主题(文章here)。因此,如果您启用暗模式(手动,如 here 所写),您将获得应用程序的设置屏幕,如下所示:

enter image description here

到目前为止,我唯一发现的是上述文章,并且我正在关注此类主题。

我也知道如何请求操作系统使用动态壁纸更改颜色,但这似乎在 Android Q 上发生了变化,至少根据我在尝试时看到的情况(我认为它更多基于时间,但不确定)。

问题

  • 是否有 API 可以获取操作系统设置使用的颜色?
  • 是否有任何类型的 API 来获取操作系统的主题?来自哪个版本?
  • 新的 API 是否也与夜间模式有关?这些如何协同工作?
  • 应用程序是否有一个很好的 API 来处理所选主题?这意味着如果操作系统处于某个主题中,那么当前的应用程序也会如此吗?
  • 最佳答案

    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 一起启动。

    结果

    result

    关于android - 是否有 API 可以检测操作系统正在使用哪个主题 - 深色或浅色(或其他)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55787035/

    相关文章:

    themes - 在 Jupyter Notebook 中更改主题?

    Android:如何将菜单项添加到 ActionBarSherlock MapActivity

    android - 构建 Rails Web 应用的移动应用衍生产品

    android - ImageButton:强制方形图标(高度=WRAP_CONTENT,宽度=?)

    javascript - 编辑主题文件时,用于侧面菜单高度的CSS不会更改

    java - 不允许到 www.sia.co.id 的明文 HTTP 流量。不能在 android 版本 pie 中工作,但可以在 oreo 和所有 pie 下工作。为什么?

    Android:Singleton DefaultHttpClient 不会保持 session

    vue.js - 使用 Vue.js 的用户可切换自定义主题

    android - Android 9 Pie 中的拖放崩溃

    Android 9 上的 android.database.sqlite.SQLiteCantOpenDatabaseException