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

时间:2014-10-25 09:44:54

标签: android android-5.0-lollipop android-cardview

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);

这些解决方案不起作用,因为该卡有一张c​​ardCornerRadius。

20 个答案:

答案 0 :(得分:231)

您正在寻找的是:

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

在XML

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

答案 1 :(得分:116)

使用属性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"
    >

答案 2 :(得分:21)

您可以在XML中使用它

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

或Java中的这个

cardView.setCardBackgroundColor(Color.WHITE);

答案 3 :(得分:17)

我使用此代码以编程方式设置:

card.setCardBackgroundColor(color);

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

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

答案 4 :(得分:8)

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);

修改

这不会给你影子&lt; API 21,因此您必须对RoundRectDrawableWithShadow执行相同的操作。

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

答案 5 :(得分:8)

这里有点晚了&amp;部分偏离主题,因为这不是以编程方式,但我发现最好为小部件设置样式,你可以为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>

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

 dependencies {
     compile 'com.android.support:appcompat-v7:22.2.0'
 }
希望这会有所帮助。快乐的编码

答案 6 :(得分:3)

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

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

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

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

答案 7 :(得分:2)

JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

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

答案 8 :(得分:2)

我尝试以编程方式创建一个cardview时遇到了同样的问题,奇怪的是,查看文档https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int%29,谷歌的人公开了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"/>

这样做我成功地保持了卡片视图阴影和圆角。

答案 9 :(得分:2)

您可以在Java中使用它。

cardView.setCardBackgroundColor(Color.parseColor(“#cac8a0”));

代码颜色形式http://www.color-hex.com/

答案 10 :(得分:2)

在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

答案 11 :(得分:1)

对我来说,最简单的方法是(科特琳)

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

答案 12 :(得分:0)

我在 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);

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

答案 13 :(得分:0)

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

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)

答案 14 :(得分:0)

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

在ViewHolder中:

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

在适配器中

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

答案 15 :(得分:0)

您可以在下面使用

cardview.setBackgroundColor(Color.parseColor("#EAEDED"));

答案 16 :(得分:0)

在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))
}

答案 17 :(得分:0)

您可以在 XML 中使用它

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

或以编程方式

cardView.setCardBackgroundColor(ContextCompat.getColor(this, R.color.my_color));

答案 18 :(得分:0)

如果你想改变卡片的色调,试试这个代码,它对我有用。 对我来说,这段代码有效。我将它与卡片和图像视图一起使用,但我认为它可以在任何视图中工作以更改其色调颜色。 cardBookmark 是我的 cardView 名称。

var cardDrawable: Drawable = binding.cardBookmark.background
cardDrawable = DrawableCompat.wrap(cardDrawable)
DrawableCompat.setTint(cardDrawable, resources.getColor(R.color.shuffleColor))
binding.cardBookmark.background = cardDrawable

答案 19 :(得分:-1)

  

尝试轻松实现

<android.support.v7.widget.CardView

card_view:cardBackgroundColor="#fff"

card_view:cardCornerRadius="9dp"
card_view:cardElevation="4dp"

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

android:paddingTop="10dp"
android:paddingBottom="10dp"

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