Ändern Sie die Hintergrundfarbe von CardView programmgesteuert


128

Die CardView verfügt über ein Attribut card_view:cardBackgroundColorzum Definieren der Hintergrundfarbe. Dieses Attribut funktioniert gut.

Gleichzeitig gibt es keine Methode, um die Farbe dynamisch zu ändern.

Ich habe gerade Lösungen ausprobiert wie:

mCardView.setBackgroundColor(...);

oder Verwenden eines Layouts in der 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);

Diese Lösungen funktionieren nicht, da die Karte einen cardCornerRadius hat.

Antworten:


265

Was Sie suchen ist:

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

In XML

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

Update: in XML

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

7
Es scheint eine neue Methode in Support Lib. Ich habe es im letzten Monat nicht gesehen, vielleicht ist es ein Update
Gabriele Mariotti

5
Vielleicht möchten Sie hinzufügen, dass die Möglichkeit, dies in XML zu konfigurieren, istcard_view:cardBackgroundColor="@android:color/white"
Mavamaarten

3
Die Verwendung des card_viewNamespace funktioniert bei mir nicht, ich muss appstattdessen verwenden.
Rsicarelli

1
@rsicarelli Alles hängt davon ab, wie Sie es nennen:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
Bryan Bryce

1
Wie kann ich Gradient Drawable programmgesteuert auf Kartenhintergrund einstellen?
Ghodasara Bhaumik

115

Verwenden Sie die Eigenschaft 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"
    >

Das OP hat uns in der ersten Zeile seiner Frage von dieser Eigenschaft erzählt, er sagte, er wolle sie "dinamisch" erreichen.
Stramin

25

Sie können dies in XML verwenden

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

oder dies in Java

cardView.setCardBackgroundColor(Color.WHITE);

19

Ich habe diesen Code verwendet, um programmgesteuert festzulegen:

card.setCardBackgroundColor(color);

Oder in XML können Sie diesen Code verwenden:

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

Diese Antwort ist nützlicher, da sie das statische (XML) und das programmatische (JAVA) Kudos enthält.
Chntgomez

9

Die Art und Weise, wie sie in der initializeMethode festgelegt wird, verwendet die geschützte RoundRectDrawableKlasse wie folgt:

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

Es ist nicht schön, aber Sie können diese Klasse erweitern. Etwas wie:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

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

}

dann:

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

BEARBEITEN

Dies gibt Ihnen keinen Schatten auf <API 21, daher müssten Sie dasselbe tun RoundRectDrawableWithShadow.

Es scheint keinen besseren Weg zu geben, dies zu tun.


2
+1 für Hacking und ich stimme zu. Ich kann keine bessere Lösung finden. Jedenfalls hoffe ich auf etwas anderes in der offiziellen API.
Gabriele Mariotti

Ist diese Klasse (RoundRectDrawableWithShadow oder RoundRectDrawable) zugänglich? Ich glaube nicht
Napolean

8

Ein wenig spät hier und teilweise außerhalb des Themas, da dies nicht programmgesteuert ist, aber ich finde es am besten, Stile für Widgets einzurichten, und Sie können dies tun, um CardVieweinfach einen Stil zu erstellen, der Ihre XML-Datei sauberer hält ...

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

das benutzt android.support.v7.widget.CardView

und dann den Stil in der Layoutdatei festlegen:

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

Sie müssen die Appcompat-v7-Bibliothek mit Android Studio über gradle importieren:

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

hoffe das hilft. fröhliche Codierung


1
Vielen Dank für den Hinweis auf das XML-Styling. Immer damit zu kämpfen. Gibt es keine Möglichkeit, den Stil in der Datei theme.xml zu definieren? Dann müssten Sie nicht den Stil für jede CardView festlegen.
Wirling

Das ist ziemlich großartig - ich hatte Probleme damit, herauszufinden, wie Selektoren durch das Layout verbreitet werden können - und dies funktionierte NICHT vor API21. Die Welligkeit funktionierte nach API21 einwandfrei, aber Ihr Themenansatz war das erste Mal, dass ich es geschafft habe, dass CardView beim Klicken auf den Inhalt den richtigen Eindruck vermittelt.
Jim Andreas

Das OP hat uns in der ersten Zeile seiner Frage von dieser Eigenschaft erzählt, er sagte, er wolle sie "dinamisch" erreichen.
Stramin

7

Ich hatte ein ähnliches Problem beim Formatieren von CardViews in einer recylerView.

Ich habe diese einfache Lösung zum Laufen gebracht, bin mir nicht sicher, ob es die beste Lösung ist, aber sie hat bei mir funktioniert.

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

Es wird der Hintergrund von cardView gezeichnet und getönt.



3

In JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android verwenden ARGB-Farben. Sie können wie folgt verwenden (0xFF + RGB COLOR) - Hartcodierte Farbe.


2

Beim Versuch, programmgesteuert eine Kartenansicht zu erstellen, bin ich auf dasselbe Problem gestoßen. Seltsam ist, dass Sie sich das Dokument https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int ansehen % 29 , Google-Leute haben die API veröffentlicht, um die Hintergrundfarbe einer Kartenansicht zu ändern, aber seltsamerweise ist es mir nicht gelungen, in der Support-Bibliothek darauf zuzugreifen. Deshalb hat Folgendes für mich funktioniert:

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

Dadurch gelingt es mir, den Schatten der Kartenansicht und die abgerundeten Ecken beizubehalten.


Sie fügen auf diese Weise ein LL in Ihre Kartenansicht ein und natürlich können Sie dies tun, aber es beantwortet nicht die ursprüngliche Frage.
Gabriele Mariotti

Bei der Anfrage ging es darum, die Hintergrundfarbe der Karte dynamisch zu ändern, und ich denke, diese Methode funktioniert ziemlich einfach, indem die Hintergrundfarbe des inneren Layouts geändert wird. Oder fehlt mir etwas?
Martial Konvi

2

Ich habe das gleiche Problem auf Xamarin.Android - VS (2017)

Die Lösung , die für mich funktioniert hat:

LÖSUNG

Fügen Sie in Ihrer XML-Datei Folgendes hinzu:

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

und android.support.v7.widget.CardViewfüge in deinem Element diesen Anstand hinzu:

card_view:cardBackgroundColor="#ffb4b4"

(dh)

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

Sie können auch hinzufügen cardElevationund cardElevation.

Wenn Sie das cardview programmgesteuert bearbeiten möchten, müssen Sie nur diesen Code verwenden: Für (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);

Und jetzt können Sie die Hintergrundfarbe programmgesteuert ändern, ohne Rand, Eckenradius und Höhe zu verlieren.



1

Der einfachste Weg für mich ist dieser (Kotlin)

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

0

Cardviewist ein bisschen schüchtern. Ich hatte eine Liste von Farben in meiner Struktur und Modell ist wie

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
}

}}

Laden Sie das Modell mit Farbe, das letzte Element auf der Konstruktion aus R.color

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

und schließlich können Sie BackgrıundResource setzen

 cv_add_goal_choose_color.setBackgroundResource(color)

0

Ich habe endlich die Ecken, um zu bleiben. Dies ist c #, Xamarin.Android

in ViewHolder:

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

Im Adapter:

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

0

In Kotlin ist das sehr einfach. Verwenden Sie ColorStateList, um die Farbe der Kartenansicht zu ändern

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

Eine Kotlin-Erweiterung von ColorStateList:

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

0

In Kotlin konnte ich die Hintergrundfarbe folgendermaßen ändern:

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

Wenn Sie dann die Farbe entfernen möchten, können Sie dies tun:

card.setCardBackgroundColor(Color.TRANSPARENT)

Mit dieser Methode konnte ich eine Auswahlanimation erstellen.
https://gfycat.com/equalcarefreekitten


-1

versuchen Sie es funktioniert einfach

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

Das OP hat uns in der ersten Zeile seiner Frage von dieser Eigenschaft erzählt, er sagte, er wolle sie programmatisch / dinamisch erreichen.
Stramin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.