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

3
我正在尝试理解为什么在浅色和深色主题下ActionBar的样式不同。以下是一个简单的设置屏幕,可以在相同的主题下在浅色和深色之间进行切换。

enter image description here

文件路径:values\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>

values-night\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>

values\colors.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>

在浅色主题中,ActionBar 是蓝白相间的,表示它正在使用colorPrimarycolorOnPrimary。在深色主题中,它是红绿相间的,表示它正在使用colorSurfacecolorOnSurface。为什么会有这种不同的应用方式,我该如何使ActionBar的颜色应用保持一致?

相关链接:https://dev59.com/xW8NtIcB2Jgan1znlpUU - AlikElzin-kilaka
1个回答

6
为什么会有不同的应用方式?
文档中引用:“大面积不应使用亮背景颜色,因为它们可能会发射过多的亮度。在适当的情况下,Material 主题将默认提供此行为,例如,通过使 Light 主题默认为 Widget.MaterialComponents.AppBarLayout.Primary 和 Dark 主题默认为 Widget.MaterialComponents.AppBarLayout.Surface。”
因此,虽然在浅色和深色主题中都有相同的颜色,但在浅色模式下,Primary 颜色是优选的颜色,在深色模式下,Surface 颜色是优选的颜色。
如何获得一致的 ActionBar 颜色应用?
可以从前面的文档中得出结论...
因此,你只需要让 values\themes.xml 包含以下内容:
1. colorPrimary & colorSurface 具有相同的值 2. colorOnPrimary & colorOnSurface 具有相同的值
将其应用到您的示例中
values\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="colorOnPrimary">@color/white</item>
        
        <item name="colorSurface">@color/blue_normal</item>
        <item name="colorOnSurface">@color/white</item>
    </style>
</resources>

了解更多信息,请查看文档


1
关于Primary vs Surface的引用突然让一切变得清晰起来。谢谢你提供的链接和XML示例(还有再次帮助我)。 - Devin Rodriguez
谢谢。我浪费了一整天的时间才找到如何在暗模式下更改工具栏颜色。我认为安卓文档网站真是糟糕透顶。Stackoverflow的用户和Medium上的回答和内容要好得多。 - NimaAzhd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接