将 CardView 颜色与 App Background Color XML 分开设置(浅色视图)

Posted

技术标签:

【中文标题】将 CardView 颜色与 App Background Color XML 分开设置(浅色视图)【英文标题】:Set CardView color separate from App Background Color XML (light view) 【发布时间】:2021-12-15 20:06:28 【问题描述】:

我正在尝试在我的应用中设置灯光模式的背景颜色。我显示的卡片在浅色或深色模式下都应该是白色的。

我正在阅读的所有内容都告诉我,我可以简单地放置这条线: app:cardBackgroundColor="#FFEF00" 进入我的<androidx.cardview.widget.CardView>,但这似乎并没有覆盖我在themes.xml 背景中的颜色。

我希望背景颜色为浅灰色,卡片背景为白色(在浅色模式下)。

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/movie_item"
    android:layout_
    android:layout_
    android:layout_below="@+id/progress_bar"
    android:orientation="vertical">

    <androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_
        android:layout_
        android:layout_margin="10dp"
        card_view:cardCornerRadius="16dp"
        app:cardBackgroundColor="#FFEF00"
        >

        <RelativeLayout
            android:layout_
            android:layout_>

            <ImageView
                android:id="@+id/movie_photo"
                android:layout_
                android:layout_
                android:layout_centerHorizontal="true"
                android:contentDescription="Movie Image" />

            <TextView
                android:id="@+id/movie_title"
                android:layout_below="@+id/movie_photo"
                android:layout_
                android:layout_
                android:layout_margin="5dp"
                android:text="Title: "
                android:textSize="15sp" />

            <TextView
                android:id="@+id/movie_overview"
                android:layout_below="@+id/movie_title"
                android:layout_
                android:layout_
                android:layout_margin="5dp"
                android:text="OverView : " />

            <TextView
                android:id="@+id/movie_rating"
                android:layout_
                android:layout_
                android:layout_below="@+id/movie_overview"
                android:layout_margin="5dp"
                android:text="Rating : "
                android:textSize="15sp" />


        </RelativeLayout>

    </androidx.cardview.widget.CardView>

</RelativeLayout>

我的主题.xml 文件:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MovieSpotter" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
        <item name="android:background">@color/gray</item>
    </style>
</resources>

【问题讨论】:

【参考方案1】:

我最终在我的主题中为 CardView 小部件创建了卡片样式,并决定使其具有适应性(浅色/深色模式)。

我在 XML 文件的 CardView 中添加了style="Widget.App.CardStyle"

<androidx.cardview.widget.CardView
        android:id="@+id/card_view"
        android:layout_
        android:layout_
        android:layout_margin="10dp"
        style="Widget.App.CardStyle"
        card_view:cardCornerRadius="16dp">

然后根据我的theme.xml,我在现有的&lt;style&gt; &lt;/style&gt;标签下面添加了这个:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name=...>
...
</style>

    <style name="Widget.App.CardStyle"
        parent="Widget.MaterialComponents.CardView">
        <item name="materialThemeOverlay">@style/Widget.App.CardStyle</item>
    </style>
    <style name="materialThemeOverlay">
        <item name="colorPrimary">@color/white</item>
    </style>

</resources>

以及night/themes.xml 中随附的暗模式视图

<resources...
<style...
</style>
    
<style name="Widget.App.CardStyle"
            parent="Widget.MaterialComponents.CardView">
            <item name="materialThemeOverlay">@style/Widget.App.CardStyle</item>
        </style>
        <style name="materialThemeOverlay">
            <item name="colorPrimary">@color/black</item>
        </style>

</resources>

【讨论】:

【参考方案2】:

选项 1:


如果您不希望这种行为,请将其添加到您的主题中。

<item name="elevationOverlayEnabled">false</item>

您还可以通过更改 alpha 将其调整为另一种颜色甚至更微妙的叠加版本:

<item name="elevationOverlayColor">#FFEF00</item>

您可以在此处阅读: https://material.io/develop/android/theming/dark/ 在Elevation Overlays 部分中


选项 2:


Style.xml:

<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>

【讨论】:

我看到过类似的答案。我将Java File 信息放在哪里?我要创建一个新的 Java 文件吗? 更新我的答案请检查它【参考方案3】:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/movie_item"
android:layout_
android:layout_
android:layout_below="@+id/progress_bar"
android:background="#D3D3D3"
android:orientation="vertical">

<androidx.cardview.widget.CardView
    android:id="@+id/card_view"
    android:layout_
    android:layout_
    android:layout_margin="10dp"
    app:cardBackgroundColor="#FFFFFFFF"
    card_view:cardCornerRadius="16dp">

    <RelativeLayout
        android:layout_
        android:layout_>

        <ImageView
            android:id="@+id/movie_photo"
            android:layout_
            android:layout_
            android:layout_centerHorizontal="true"
            android:contentDescription="Movie Image" />

        <TextView
            android:id="@+id/movie_title"
            android:layout_
            android:layout_
            android:layout_below="@+id/movie_photo"
            android:layout_margin="5dp"
            android:text="Title: "
            android:textSize="15sp" />

        <TextView
            android:id="@+id/movie_overview"
            android:layout_
            android:layout_
            android:layout_below="@+id/movie_title"
            android:layout_margin="5dp"
            android:text="OverView : " />

        <TextView
            android:id="@+id/movie_rating"
            android:layout_
            android:layout_
            android:layout_below="@+id/movie_overview"
            android:layout_margin="5dp"
            android:text="Rating : "
            android:textSize="15sp" />


    </RelativeLayout>

</androidx.cardview.widget.CardView>

</RelativeLayout>

你想设置背景颜色浅灰色和卡片颜色白色而不是试试这个......

谢谢...

【讨论】:

这确实有效,但我发布的themes.xml 文件是特定于浅色主题的。当我对xml 文件进行硬编码时,它最终会在明暗中使用相同的配色方案。 我更新了我的原始帖子以反映该信息。谢谢!

以上是关于将 CardView 颜色与 App Background Color XML 分开设置(浅色视图)的主要内容,如果未能解决你的问题,请参考以下文章

阴影系列:YcCardView实现不同颜色的阴影(带圆角)

CardView 中突出显示的文本没有颜色

按奇偶顺序为cardView设置不同的背景颜色

kotlin android CardView删除边框

Android 材质 CardView 波纹效果改变内容颜色

如果我将半透明颜色设置为 cardBackgroundColor,cardView 中间会出现奇怪的矩形形状