以编程方式更改CardView的背景颜色


130

所述CardView具有属性card_view:cardBackgroundColor来定义的背景颜色。此属性工作正常。

同时,没有一种可以动态更改颜色的方法。

我刚刚尝试了以下解决方案:

mCardView.setBackgroundColor(...);

或在cardView内使用布局

   <android.support.v7.widget.CardView>
        <LinearLayout
            android:id="@+id/inside_layout">
    </android.support.v7.widget.CardView>  

 View insideLayout = mCardView.findViewById(R.id.inside_layout);
 cardLayout.setBackgroundColor(XXXX);

这些解决方案不起作用,因为该卡具有cardCornerRadius。

Answers:


266

您正在寻找的是:

CardView card = ...
card.setCardBackgroundColor(color);

在XML中

 card_view:cardBackgroundColor="@android:color/white"

更新:XML

app:cardBackgroundColor="@android:color/white"

7
似乎是支持lib的新方法。我上个月没看到它,可能是更新了
Gabriele Mariotti 2014年

5
可能想补充一点,以XML进行配置的方法是card_view:cardBackgroundColor="@android:color/white"
Mavamaarten

3
使用card_view命名空间对我不起作用,我必须使用它app
rsicarelli

1
@rsicarelli一切取决于您的名字:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
Bryan Bryce

1
如何以编程方式将渐变可绘制设置为卡片背景?
Ghodasara Bhaumik,

115

使用属性card_view:cardBackgroundColor:

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="fill_parent"
    android:layout_height="150dp"
    android:layout_gravity="center"
    card_view:cardCornerRadius="4dp"
    android:layout_margin="10dp"
    card_view:cardBackgroundColor="#fff"
    >

OP在他的问题的第一行中向我们介绍了该财产,他说他想“异常地”实现它。
斯特拉明'19

25

您可以在XML中使用它

card_view:cardBackgroundColor="@android:color/white"

或在Java中

cardView.setCardBackgroundColor(Color.WHITE);

19

我使用以下代码以编程方式进行设置:

card.setCardBackgroundColor(color);

或者在XML中,您可以使用以下代码:

card_view:cardBackgroundColor="@android:color/white"

这个答案更有用,因为它包含静态(XML)和编程方式(JAVA)的荣誉。
chntgomez '16

9

在方法中设置的initialize方式使用受保护的RoundRectDrawable类,如下所示:

RoundRectDrawable backgroundDrawable = new RoundRectDrawable(backgroundColor, cardView.getRadius());
cardView.setBackgroundDrawable(backgroundDrawable);

它不是很漂亮,但是您可以扩展该类。就像是:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

    public MyRoundRectDrawable(int backgroundColor, float radius) {
        super(backgroundColor, radius);
    }

}

然后:

final MyRoundRectDrawable backgroundDrawable = new MyRoundRectDrawable(bgColor,
            mCardView.getRadius());
mCardView.setBackgroundDrawable(backgroundDrawable);

编辑

这不会给您<API 21带来的阴影,因此您必须使用RoundRectDrawableWithShadow

似乎没有更好的方法可以做到这一点。


2
+1骇客入侵,我同意。我找不到更好的解决方案。无论如何,我希望官方API有所不同。
Gabriele Mariotti 2014年

此类(RoundRectDrawableWithShadow或RoundRectDrawable)是否可访问?我不这么认为
拿破仑2014年

8

到这里有点晚了,因为它不是以编程方式来完成的,所以部分脱离主题,但是我发现最好为Widget设置样式,您可以CardView仅创建样式就可以做到这一点,它将使您的xml更加干净。

<style name="MyCardViewStyle" parent="CardView">
    <!-- Card background color -->
    <item name="cardBackgroundColor">@android:color/white</item>
    <!-- Ripple for API 21 of android, and regular selector on older -->
    <item name="android:foreground">?android:selectableItemBackground</item>
    <!-- Resting Elevation from Material guidelines -->
    <item name="cardElevation">2dp</item>
    <!-- Add corner Radius -->
    <item name="cardCornerRadius">2dp</item>
    <item name="android:clickable">true</item>
    <item name="android:layout_margin">8dp</item>
</style>

这正在使用 android.support.v7.widget.CardView

然后在布局文件中设置样式:

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.v7.widget.CardView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
     android:layout_width="match_parent"
     style="@style/MyCardViewStyle">
    <!-- Other fields-->
 </android.support.v7.widget.CardView>

您需要通过gradle使用Android Studio导入appcompat-v7库:

 dependencies {
     compile 'com.android.support:appcompat-v7:22.2.0'
 }

希望这可以帮助。快乐编码


1
感谢您指出XML样式。一直为此奋斗。没有办法在themes.xml中定义样式吗?然后,您不必为每个CardView设置样式。
威林

那真是太棒了-我正在努力弄清楚如何在整个布局中向下传播选择器-并且在API21之前无法正常工作。API21之后的涟漪效果很好,但是您的主题方法是我第一次设法获得CardView,以便在单击内容时提供正确的外观。
吉姆·安德里亚斯

OP在他的问题的第一行中向我们介绍了该财产,他说他想“异常地”实现它。
斯特拉明

7

我在用recylerView格式化CardView时遇到类似的问题。

我得到了这个简单的解决方案,虽然不确定是否是最佳解决方案,但是它对我有用。

mv_cardView.getBackground().setTint(Color.BLUE)

它获取cardView的背景Drawable并对其进行着色。



3

JAVA中

cardView.setCardBackgroundColor(0xFFFEFEFE);

android使用ARGB颜色。您可以这样使用(0xFF + RGB COLOR)-硬编码的颜色。


2

我在尝试以编程方式创建Cardview时遇到了相同的问题,奇怪的是,看着文档https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int %29,Google家伙公开了api来更改名片视图的背景颜色,但是很奇怪,我没有在支持库中成功访问它,所以这对我有用:

CardViewBuilder.java

    mBaseLayout = new FrameLayout(context);
    // FrameLayout Params
    FrameLayout.LayoutParams baseLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    mBaseLayout.setLayoutParams(baseLayoutParams);

    // Create the card view.
    mCardview = new CardView(context);
    mCardview.setCardElevation(4f);
    mCardview.setRadius(8f);
    mCardview.setPreventCornerOverlap(true); // The default value for that attribute is by default TRUE, but i reset it to true to make it clear for you guys
    CardView.LayoutParams cardLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    cardLayoutParams.setMargins(12, 0, 12, 0);
    mCardview.setLayoutParams(cardLayoutParams);
    // Add the card view to the BaseLayout
    mBaseLayout.addView(mCardview);

    // Create a child view for the cardView that match it's parent size both vertically and horizontally
    // Here i create a horizontal linearlayout, you can instantiate the view of your choice
    mFilterContainer = new LinearLayout(context);
    mFilterContainer.setOrientation(LinearLayout.HORIZONTAL);
    mFilterContainer.setPadding(8, 8, 8, 8);
    mFilterContainer.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT, Gravity.CENTER));

    // And here is the magic to get everything working
    // I create a background drawable for this view that have the required background color
    // and match the rounded radius of the cardview to have it fit in.
    mFilterContainer.setBackgroundResource(R.drawable.filter_container_background);

    // Add the horizontal linearlayout to the cardview.
    mCardview.addView(mFilterContainer);

filter_container_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="8dp"/>
<solid android:color="@android:color/white"/>

这样做,我成功地保持了Cardview的阴影和圆角。


您可以通过这种方式在卡片视图中添加一个LL,您当然可以这样做,但是它不能回答原始问题。
加布里埃里奥·马里奥蒂

要求是关于动态更改卡的背景颜色,我认为此方法非常简单,只需更改内部布局的背景颜色即可。还是我错过了什么。
武术Konvi 2014年

2

我在Xamarin.Android-VS(2017)上遇到了同样的问题

对我有用的解决方案

在您的XML文件中添加:

 xmlns:card_view="http://schemas.android.com/apk/res-auto"

并在 android.support.v7.widget.CardView元素中添加以下属性:

card_view:cardBackgroundColor="#ffb4b4"

(即)

<android.support.v7.widget.CardView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_margin="12dp"
    card_view:cardCornerRadius="4dp"
    card_view:cardElevation="1dp"
    card_view:cardPreventCornerOverlap="false"
    card_view:cardBackgroundColor="#ffb4b4" />

您还可以添加cardElevationcardElevation

如果要以cardview 编程方式进行编辑,则只需使用以下代码:对于(C#)

    cvBianca = FindViewById<Android.Support.V7.Widget.CardView>(Resource.Id.cv_bianca);
    cvBianca.Elevation = 14;
    cvBianca.Radius = 14;
    cvBianca.PreventCornerOverlap = true;
    cvBianca.SetCardBackgroundColor(Color.Red);

现在,您可以通过编程方式更改背景颜色,而不会丢失边框,拐角半径和高程。



1

在Kotlin中这很简单。使用ColorStateList更改名片视图的颜色

   var color = R.color.green;
   cardView.setCardBackgroundColor(context.colorList(color));

ColorStateList的kotlin扩展:

fun Context.colorList(id: Int): ColorStateList {
    return ColorStateList.valueOf(ContextCompat.getColor(this, color))
}

1

对我来说,最简单的方法是(Kotlin)

card_item.backgroundTintList = ColorStateList.valueOf(Color.parseColor("#fc4041"))

0

Cardview有点co。我的结构中有颜色列表,模型就像

class ModelColor : Serializable {

var id: Int? = 0
var title: String? = ""
var color: Int? = 0// HERE IS THE COLOR FIELD WE WILL USE

constructor(id: Int?, title: String?, color: Int?) {
    this.id = id
    this.title = title
    this.color = color
}

}

用颜色加载模型,结构上的最后一项取自 R.color

 list.add(ModelColor(2, getString(R.string.orange), R.color.orange_500))

最后,您可以设置BackgrıundResource

 cv_add_goal_choose_color.setBackgroundResource(color)

0

我终于有机会留下了。这是C#,Xamarin.Android

在ViewHolder中:

CardView = itemView.FindViewById<CardView>(Resource.Id.cdvTaskList);

在适配器中:

vh.CardView.SetCardBackgroundColor(Color.ParseColor("#4dd0e1"));

0

在Kotlin中,我能够像这样更改背景颜色:

var card: CardView = itemView.findViewById(com.mullr.neurd.R.id.learn_def_card)
card.setCardBackgroundColor(ContextCompat.getColor(main,R.color.selected))

然后,如果要删除颜色,可以执行以下操作:

card.setCardBackgroundColor(Color.TRANSPARENT)

使用这种方法,我能够创建选择动画。
https://gfycat.com/equalcarefreekitten


-1

尝试轻松

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:cardBackgroundColor="#fff"
    card_view:cardCornerRadius="9dp"
    card_view:cardElevation="4dp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

OP在他的问题的第一行中向我们介绍了该属性,他说他想以编程方式/常规方式实现。
斯特拉明
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.