web-dev-qa-db-fra.com

Modifier la couleur d'arrière-plan de CardView par programme

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

Dans le même temps, il n’existe pas de méthode permettant de modifier la couleur de manière dynamique.

J'ai juste essayé des solutions comme:

mCardView.setBackgroundColor(...);

ou en utilisant une mise en page à l'intérieur de la 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.

98
Gabriele Mariotti

Ce que vous recherchez, c'est:

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

En XML 

 card_view:cardBackgroundColor="@Android:color/white"
222
Simon Heinen

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

Vous pouvez l'utiliser en XML

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

ou ceci en Java

cardView.setCardBackgroundColor(Color.WHITE);
21
eluleci

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
m.v.n.kalyani

Un peu tard ici et partiellement hors sujet puisque ce n'est pas programmé mais je trouve qu'il est préférable de configurer les styles pour les widgets et vous pouvez le faire pour un CardView il suffit de créer un style qui gardera votre code 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>

ceci utilise Android.support.v7.widget.CardView 

puis en définissant 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 à l'aide du studio Android via gradle:

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

j'espère que cela t'aides. bonne codage

9
kandroidj

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

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 <API 21, vous devrez donc faire la même chose avec RoundRectDrawableWithShadow

Il ne semble pas y avoir de meilleur moyen de le faire.

8
Paul Burke

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

Cette solution simple fonctionne, mais je ne suis pas sûr que ce soit la meilleure solution, mais elle a fonctionné pour moi.

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

Il obtient l'arrière-plan Drawable de la carte et le teinte.

3
Steve

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 doc https://developer.Android.com/reference/Android/support/v7/widget/CardView.html#setCardBackgroundColor % 28int% 29 , Les gars de Google ont rendu publique l’API permettant de changer la couleur d’arrière-plan d’une vue de carte, mais étrangement, je n’ai pas réussi à y accéder dans la bibliothèque de support. 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"/>

En faisant cela, je réussis à garder l’ombre de Cardview et des angles arrondis.

2
Martial Konvi

En Java

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android utilise les couleurs ARGB. vous pouvez utiliser comme ceci (0xFF + RGB COLOR) - Couleur codée en dur. 

2
yakup_y

Vous pouvez l'utiliser en Java.

cardView.setCardBackgroundColor (Color.parseColor ("# cac8a0"));

code couleur forme http://www.color-hex.com/

1
Muthu Krishnan

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

La Solution qui a fonctionné pour moi:

SOLUTION

Dans votre fichier XML, ajoutez:

 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 voulez éditer la cardview par programme , vous devez simplement utiliser ce code: 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);

Et maintenant, vous pouvez changer la couleur de fond par programmation sans perte de bordure, de rayon et d’altitude.

0
Fabio

essayez ça marche 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">

Cardview est un peu timide. J'ai eu la liste des couleurs dans ma structure et le modèle est comme

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
}

}

charge le modèle avec la couleur, dernier élément sur la construction à partir de R.color

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

et enfin vous pouvez définirBackgrıundResource

 cv_add_goal_choose_color.setBackgroundResource(color)
0
Sam

J'ai enfin eu les coins pour rester. C'est c #, Xamarin.Android

dans ViewHolder:

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

Dans l'adaptateur:

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

Vous pouvez utiliser ci-dessous

cardview.setBackgroundColor(Color.parseColor("#EAEDED"));
0
Aditya Patil