6

背景

我知道 Android Q 上有一个新功能最终支持深色主题(在这里写了关于检测它)。

我也知道有“夜灯”功能(这里)使屏幕变得更黄。

支持手动选择主题是我多年来一直在做的事情(在 Activity 的 onCreate 的第一行代码上简单地使用setTheme),但我想知道是否有自动的东西可以让我在应用程序真正启动之前设置它,在启动画面中。

问题

似乎一个非常古老的功能(从 API 8 开始!)在 Android 上已经存在了很长时间,在资源中有“夜间”限定符,我什至从未尝试过。

可悲的是,因为“黑暗主题”和与夜间相关的东西现在更多地被称为新功能(例如这里),所以我找不到旧功能的全部内容。

但是,查看一些文章和文档,它似乎几乎完全是手动的:

我试过的

我尝试相应地设置各种主题:

res/drawable/splash.xml

  <layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
    <item android:gravity="fill">
      <shape android:shape="rectangle">
        <solid android:color="#fff"/>
      </shape>
    </item>
    ...
  </layer-list>

res/drawable-v29/splash.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
  <item android:gravity="fill">
    <shape android:shape="rectangle">
      <solid android:color="?attr/colorSurface"/>
    </shape>
  </item>
  ...
</layer-list>

res/drawable-night/splash.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
  <item android:gravity="fill">
    <shape android:shape="rectangle">
      <solid android:color="#000"/>
    </shape>
  </item>
  ...
</layer-list>

显现

res/values/themes.xml

  <style name="AppTheme_splash" parent="@style/Theme.MaterialComponents.DayNight">
    <item name="android:windowBackground">@drawable/splash</item>
  </style>

res/values-v26/themes.xml

  <style name="AppTheme_splash" parent="@style/Theme.MaterialComponents.DayNight">
    <item name="android:windowSplashscreenContent">@drawable/splash</item>
  </style>

我试图删除android:windowBackgroundand android:windowSplashscreenContent,试图查看它是否是自动的,但它没有帮助。

问题

基本上我只想知道夜间模式以及是否可以将其用于启动画面:

  1. Android支持这么久的“夜间模式”什么时候开始?

  2. 它是操作系统全局模式吗?用户控制它吗?

  3. 是自动的吗?还是完全由当前应用手动操作?

  4. 即使我通过应用程序手动设置并且应用程序被杀死,该模式是否会保留?

  5. 是否可以将应用程序的主题(即启动画面)设置为使用它,以便在启用夜间模式时,它会使用它来获得深色背景?

  6. 我的代码对此是否正确?

4

1 回答 1

1

实际上,可以为启动画面添加夜间修饰符。

可悲的是,它立即发生,在任何代码都可以使用之前。所以它完全基于操作系统的设置,而不是应用程序本身。

此外,IDE 上还有一个烦人的问题,即对于每个 Activity,它将首先使用我为启动创建的这个主题。

除了这 2 个缺点之外,一切正常,您可以在我的应用程序上亲自查看

这里:

res/drawable/splash.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:opacity="opaque" tools:ignore="UnusedAttribute">
    <item android:gravity="fill">
        <shape android:shape="rectangle">
            <solid android:color="#fff" />
        </shape>
    </item>
    <item
        android:width="48dp" android:height="48dp" android:gravity="center">
        <bitmap
            android:gravity="center" android:src="@mipmap/ic_launcher_foreground" />
    </item>
</layer-list>

res/drawable-night/splash.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:opacity="opaque" tools:ignore="UnusedAttribute">
    <item android:gravity="fill">
        <shape android:shape="rectangle">
            <solid android:color="#000" />
        </shape>
    </item>
    <item
        android:width="48dp" android:height="48dp" android:gravity="center">
        <bitmap
            android:gravity="center" android:src="@mipmap/ic_launcher_foreground" />
    </item>
</layer-list>

主题.xml

    <style name="AppTheme_splash" parent="@style/Theme.MaterialComponents.DayNight">
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="android:navigationBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">?android:colorBackground</item>
        <item name="colorSecondary">?colorAccent</item>
        <item name="android:colorSecondary" tools:targetApi="n_mr1">?colorAccent</item>
    </style>

显现

  <application android:theme="@style/AppTheme_splash" ...">
于 2020-03-31T20:38:31.630 回答