Android ActionBar/Toolbar 颜色在浅色主题和深色主题中不同

Dev*_*uez 3 android android-actionbar android-toolbar android-dark-theme android-darkmode

我试图理解为什么ActionBar浅色主题与深色主题的风格不同。下面是一个简单的设置屏幕,可以在具有相同主题的浅色和深色主题之间切换。

在此输入图像描述

值\主题.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Dark application theme. -->
    <style name="Theme.SettingsApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/blue_normal</item>
        <item name="colorPrimaryVariant">@color/blue_dark</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <item name="colorSurface">@color/red</item>
        <item name="colorOnSurface">@color/green</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

值夜\themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Dark application theme. -->
    <style name="Theme.SettingsApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/blue_normal</item>
        <item name="colorPrimaryVariant">@color/blue_dark</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <item name="colorSurface">@color/red</item>
        <item name="colorOnSurface">@color/green</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

值\颜色.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="blue_normal">#FF3F7FBF</color>
    <color name="blue_dark">#FF2F6090</color>
    <color name="white">#FFFFFFFF</color>
    <color name="red">#FF0000</color>
    <color name="green">#00FF00</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

在“照亮它们”中,ActionBar呈现为蓝色和白色,表明它正在使用colorPrimarycolorOnPrimary。在深色主题中,它呈现为红色和绿色,表明它正在使用colorSurfacecolorOnSurface。为什么它们的应用方式不同?如何在 上获得一致的颜色应用ActionBar

Zai*_*ain 6

为什么这些应用不同

引用自文档:

大表面不应使用明亮的背景颜色,因为它们会发出过多的亮度。如果适用,Material 主题将提供这种开箱即用的行为,例如,将浅色主题默认为Widget.MaterialComponents.AppBarLayout.Primary,将深色主题默认为Widget.MaterialComponents.AppBarLayout.Surface

因此,虽然浅色和深色主题的颜色相同,但Primary颜色是浅色模式下的首选颜色,而颜色surface是深色模式下的首选颜色。

如何在 ActionBar 上获得一致的颜色应用?

这可以从之前的文档中得出结论..

所以,你只需要包含values\themes.xml

  1. colorPrimary&colorSurface具有相同的值
  2. colorOnPrimary&colorOnSurface具有相同的值

将此应用到您的示例中

值\主题.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Dark application theme. -->
    <style name="Theme.SettingsApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/blue_normal</item>
        <item name="colorOnPrimary">@color/white</item>
        
        <item name="colorSurface">@color/blue_normal</item>
        <item name="colorOnSurface">@color/white</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看文档