Changer la couleur d'arrière-plan de CardView par programmation

Le CardView a un attribut card_view:cardBackgroundColor pour définir la couleur d'arrière-plan. Cet attribut fonctionne bien.

En même temps, il n'y a pas de méthode pour changer la couleur dynamiquement.

Je viens d'essayer des solutions comme:

mCardView.setBackgroundColor(...);

Ou en utilisant une mise en page à l'intérieur du 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);

Ces solutions ne fonctionnent pas car la carte a un cardCornerRadius.

96
demandé sur Paul Burke 2014-10-25 13:44:54

13 réponses

Ce que vous cherchez est:

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

En XML

 card_view:cardBackgroundColor="@android:color/white"
210
répondu Simon Heinen 2016-08-03 08:41:53

Utilisez la propriété 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"
    >
115
répondu user790999 2015-03-19 00:17:40

Vous pouvez l'utiliser en XML

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

Ou ceci en Java

cardView.setCardBackgroundColor(Color.WHITE);
21
répondu eluleci 2015-04-09 12:16:34

J'ai utilisé ce code pour définir par programme:

card.setCardBackgroundColor(color);

Ou en XML, vous pouvez utiliser ce code:

card_view:cardBackgroundColor="@android:color/white"
17
répondu m.v.n.kalyani 2016-02-23 07:24:37

Un peu en retard ici et partiellement hors sujet puisque ce n'est pas par programmation mais je trouve préférable de configurer des styles pour les Widgets et vous pouvez le faire pour un CardView Il suffit de créer un style qui gardera votre XML plus propre...

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

Cela utilise android.support.v7.widget.CardView

Puis définir le style dans le fichier de mise en page:

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

Vous devez importer la bibliothèque appcompat-V7 en utilisant Android studio via gradle:

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

J'espère que cela aide. code heureux

9
répondu kandroidj 2015-06-23 22:22:17

La façon dont il est défini dans la méthode initialize utilise la classe protected RoundRectDrawable, comme ceci:

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

Ce n'est pas joli, mais vous pouvez étendre cette classe. Quelque chose comme:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

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

}

Puis:

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

Modifier

Cela ne vous donnera pas l'ombre sur RoundRectDrawableWithShadow.

Il ne semble pas y avoir de meilleure façon de le faire.

8
répondu Paul Burke 2014-10-25 10:14:33

Je suis tombé sur le même problème en essayant de créer un cardview par programme, ce qui est étrange, c'est que regarder le doc https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int%29, Les gars de Google ont rendu publique l'api pour changer la couleur d'arrière-plan d'une vue de carte, mais bizarrement je n'ai pas réussi à y avoir accès dans la bibliothèque de support, alors voici ce qui a fonctionné pour moi:

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

Ce faisant, je réussis à garder l'ombre cardview et les coins arrondis.

2
répondu Martial Konvi 2014-11-27 17:52:12

Dans JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android utiliser les couleurs ARGB. vous pouvez utiliser comme ceci(0xFF + couleur RVB) - couleur codée en dur.

2
répondu yakup_y 2016-02-23 07:27:34

J'avais un problème similaire avec le formatage CardViews dans un recylerView.

J'ai fait fonctionner cette solution simple, Je ne sais pas si c'est la meilleure solution, mais cela a fonctionné pour moi.

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

Il obtient l'arrière-plan Drawable du cardView et le teinte.

2
répondu Steve 2017-11-02 14:06:34

Vous pouvez l'utiliser en java.

CardView.setCardBackgroundColor (couleur.parseColor ("#cac8a0"));

Le Code couleur de la forme http://www.color-hex.com/

1
répondu Muthu Krishnan 2018-08-29 04:43:27

Pour ceux qui se demandent d'où vient ce nom "card_view".... C'est en fait un espace de noms et de cette façon vous pouvez le créer ...

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

Ici, la deuxième ligne (du début) crée l'espace de noms.. et la dernière ligne de last est la version xml de la réponse de cette version java de question. haha santé !

0
répondu Sagiruddin Mondal 2016-08-05 17:24:59

Essayez cela fonctionne facilement

<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">
0
répondu Singupurapu prudhvi raj 2017-04-15 13:57:59

, j'ai le même problème sur Xamarin.Android-VS (2017)

La Solution qui a fonctionné pour moi:

SOLUTION

Dans votre fichier XML ajouter:

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

Et dans votre élément android.support.v7.widget.CardView Ajoutez cette propriété:

card_view:cardBackgroundColor="#ffb4b4"

(c'est-à-dire)

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

, Vous pouvez également ajouter cardElevation et cardElevation.

Si vous souhaitez modifier le cardview par programmation vous avez juste besoin d'utiliser ce code: Pour (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);

Et maintenant vous pouvez changer l'arrière-plan couleur par programmation sans bordure, rayon d'angle et élévation perdus.

0
répondu Fabio 2017-07-23 13:15:59