Cambia il colore di sfondo di CardView a livello di codice


130

Il CardView ha un attributo card_view:cardBackgroundColorper definire il colore dello sfondo. Questo attributo funziona bene.

Allo stesso tempo, non esiste un metodo per cambiare dinamicamente il colore.

Ho appena provato soluzioni come:

mCardView.setBackgroundColor(...);

o usando un layout all'interno di 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);

Queste soluzioni non funzionano perché la scheda ha un cardCornerRadius.

Risposte:


266

Quello che stai cercando è:

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

In XML

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

Aggiornamento: in XML

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

7
Sembra un nuovo metodo nel supporto lib. Non l'ho visto l'ultimo mese, forse è un aggiornamento
Gabriele Mariotti,

5
Potrebbe voler aggiungere che il modo di configurarlo in XML ècard_view:cardBackgroundColor="@android:color/white"
Mavamaarten,

3
L'uso dello card_viewspazio dei nomi non funziona per me, devo appinvece usarlo .
rsicarelli,

1
@rsicarelli Tutto dipende da come lo chiami:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
Bryan Bryce l'

1
Come posso impostare Gradient Drawable su card background a livello di codice?
Ghodasara Bhaumik,

115

Usa la proprietà 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"
    >

L'OP ci parla di quella proprietà nella prima riga della sua domanda, ha detto che vuole raggiungerla "dinamicamente".
stramin

25

Puoi usarlo in XML

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

o questo in Java

cardView.setCardBackgroundColor(Color.WHITE);

19

Ho usato questo codice per impostare a livello di codice:

card.setCardBackgroundColor(color);

O in XML puoi usare questo codice:

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

Questa risposta è più utile perché contiene i Kudos statici (XML) e programmatici (JAVA).
Chntgomez,

9

Il modo in cui è impostato nel initializemetodo utilizza la RoundRectDrawableclasse protetta , in questo modo:

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

Non è carino, ma puoi estendere quella classe. Qualcosa di simile a:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

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

}

poi:

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

MODIFICARE

Questo non ti darà l'ombra su <API 21, quindi dovresti fare lo stesso con RoundRectDrawableWithShadow .

Non sembra esserci un modo migliore per farlo.


2
+1 per l'hacking e sono d'accordo. Non riesco a trovare una soluzione migliore. Spero comunque in qualcosa di diverso nell'API ufficiale.
Gabriele Mariotti,

Questa classe (RoundRectDrawableWithShadow o RoundRectDrawable) è accessibile? Non credo
Napolean

8

Un po 'tardi qui e parzialmente fuori tema dal momento che questo non è programmaticamente, ma trovo che sia meglio impostare gli stili per i widget e puoi farlo per CardViewcreare uno stile che manterrà il tuo XML più pulito ...

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

questo sta usando android.support.v7.widget.CardView

e quindi impostando lo stile nel file di layout:

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

devi importare la libreria appcompat-v7 usando Android Studio via gradle:

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

spero che questo ti aiuti. buona programmazione


1
Grazie per aver sottolineato lo stile XML. Lottando sempre con quello. Non c'è un modo per definire lo stile in themes.xml? Quindi non dovresti impostare lo stile per ogni CardView.
Wirling

È davvero fantastico - stavo lottando per cercare di capire come propagare i selettori nel layout - e questo NON funzionava prima dell'API21. L'increspatura stava funzionando bene dopo API21, ma il tuo approccio a tema è stata la prima volta che sono riuscito a ottenere CardView per dare l'aspetto giusto facendo clic sui contenuti.
Jim Andreas,

L'OP ci parla di quella proprietà nella prima riga della sua domanda, ha detto che vuole raggiungerla "dinamicamente".
stramin

7

Stavo riscontrando un problema simile con la formattazione di CardViews in un recylerView.

Ho fatto funzionare questa semplice soluzione, non sono sicuro che sia la soluzione migliore, ma ha funzionato per me.

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

Ottiene lo sfondo Disegnabile di cardView e lo tinge.



3

A JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android usa i colori ARGB. puoi usarlo in questo modo (0xFF + RGB COLOR) - Colore hardcoded.


2

Mi sono imbattuto nello stesso problema durante il tentativo di creare una cardview a livello di codice, la cosa strana è che guardando il documento https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int 29% , i ragazzi di Google hanno reso pubblica l'API per cambiare il colore di sfondo della vista di una carta ma stranamente non sono riuscito ad accedervi nella libreria di supporto, quindi ecco cosa ha funzionato per me:

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

In questo modo riesco a mantenere l'ombra del cardview e gli angoli arrotondati.


Stai aggiungendo un LL nel tuo cardview in questo modo e ovviamente puoi farlo, ma non risponde alla domanda originale.
Gabriele Mariotti,

La richiesta riguardava la modifica dinamica del colore di sfondo della carta e penso che questo metodo lo faccia semplicemente cambiando il colore di sfondo del layout interno. Oppure mi sfugge qualcosa.
Martial Konvi,

2

Ho lo stesso problema su Xamarin.Android - VS (2017)

La soluzione che ha funzionato per me:

SOLUZIONE

Nel tuo file XML aggiungi:

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

e nel tuo android.support.v7.widget.CardViewelemento aggiungi questa proprietà:

card_view:cardBackgroundColor="#ffb4b4"

(Ie)

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

Puoi anche aggiungere cardElevatione cardElevation.

Se vuoi modificare il cardview programmaticamente devi solo usare questo codice: 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);

E ora puoi cambiare il colore di sfondo a livello di codice senza perdere bordo, raggio dell'angolo ed elevazione.



1

È molto semplice in kotlin. Usa ColorStateList per cambiare il colore della vista della carta

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

Un'estensione kotlin di ColorStateList:

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

1

Il modo più semplice per me è questo (Kotlin)

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

0

Cardviewè un po 'schivo. Avevo una lista di colori nella mia struttura e Model è come

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
}

}

carica il modello con colore, prendendo l'ultimo elemento sulla struttura R.color

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

e infine puoi impostareBackgrıundResource

 cv_add_goal_choose_color.setBackgroundResource(color)

0

Finalmente ho avuto gli angoli per restare. Questo è c #, Xamarin.Android

in ViewHolder:

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

Nell'adattatore:

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

0

In Kotlin, sono stato in grado di cambiare il colore di sfondo in questo modo:

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

Quindi se vuoi rimuovere il colore, puoi farlo:

card.setCardBackgroundColor(Color.TRANSPARENT)

Utilizzando questo metodo sono stato in grado di creare un'animazione di selezione.
https://gfycat.com/equalcarefreekitten


-1

provalo funziona facilmente

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

L'OP ci parla di quella proprietà nella prima riga della sua domanda, ha detto che vuole raggiungerla programmaticamente / dinamicamente.
stramin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.