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

CardView有一个属性card_view:cardBackgroundColor来定义背景颜色。 这个属性工作正常。

同时还没有一种方法来dynamic改变颜色。

我刚刚尝试过这样的解决scheme:

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

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

你在找什么是:

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

在XML中

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

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

你可以在XML中使用它

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

或者这在Java中

 cardView.setCardBackgroundColor(Color.WHITE); 

我用这个代码来设置编程:

 card.setCardBackgroundColor(color); 

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

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

它在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 API上的影子,所以你必须对RoundRectDrawableWithShadow做同样的事情。

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

有点迟到这里和部分题目,因为这是不是编程,但我觉得最好为Widgets设置样式,你可以做一个CardView只是创build一个样式,它会保持你的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' } 

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

我遇到同样的问题,而试图创build一个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"/> 

这样做,我成功保持cardview阴影和圆angular。

JAVA中

 cardView.setCardBackgroundColor(0xFFFEFEFE); 

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

对于那些想知道“card_view”名字来自哪里的人来说….它实际上是一个命名空间,这样你可以创build它…

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="230dp" card_view:cardCornerRadius="2dp" card_view:cardElevation="2dp" card_view:cardPreventCornerOverlap="false" card_view:cardBackgroundColor="@color/cardview_1_background" card_view:contentPadding="0dp"> 

这里第二行(从开始)创build命名空间..最后一行是java版本问题的答案的xml版本。 哈哈干杯!

尝试它很容易

 <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"> 

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

为我工作的解决scheme

在你的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你只需要使用下面的代码:For(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); 

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

我有一个类似的问题,在recylerView中格式化CardViews。

我得到了这个简单的解决scheme工作,不知道这是最好的解决scheme,但它为我工作。

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

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