कार्डव्यू की पृष्ठभूमि का रंग प्रोग्रामेटिक रूप से बदलें


130

CardView एक विशेषता है card_view:cardBackgroundColorपृष्ठभूमि रंग को परिभाषित करने के। यह विशेषता ठीक काम करती है।

उसी समय गतिशील रूप से रंग बदलने की कोई विधि नहीं है।

मैंने अभी जैसे समाधान की कोशिश की है:

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

ये समाधान काम नहीं करते हैं क्योंकि कार्ड में कार्ड कॉर्नररेडियस है।

जवाबों:


266

आप क्या देख रहे हैं:

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

XML में

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

अपडेट: XML में

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

7
यह समर्थन परिवाद में एक नई विधि लगती है। मैंने इसे पिछले महीने नहीं देखा था, हो सकता है कि यह एक अपडेट हो
गेब्रियल सेरोटी

5
XML में इसे कॉन्फ़िगर करने का तरीका जोड़ना चाह सकते हैंcard_view:cardBackgroundColor="@android:color/white"
मावामार्टन

3
card_viewनाम स्थान का उपयोग करना मेरे लिए काम नहीं करता है, मुझे appइसके बजाय उपयोग करना होगा।
rsicarelli

1
@rsicarelli सभी इस पर निर्भर करते हैं कि आप इसे क्या कहते हैं:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
ब्रायन ब्राइस

1
मैं प्रोग्रामेटिक रूप से कार्ड बैकग्राउंड को ग्रैडिएबल ड्रॉबल कैसे सेट कर सकता हूं?
घोडासरा भौमिक

115

संपत्ति का उपयोग करें 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"
    >

ओपी ने हमें अपने प्रश्न की पहली पंक्ति में उस संपत्ति के बारे में बताया, उन्होंने कहा कि वह इसे "व्यावहारिक रूप" से हासिल करना चाहते हैं।
stramin

25

आप इसे XML में उपयोग कर सकते हैं

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

या जावा में

cardView.setCardBackgroundColor(Color.WHITE);

19

मैंने प्रोग्राम को सेट करने के लिए इस कोड का उपयोग किया है:

card.setCardBackgroundColor(color);

या XML में आप इस कोड का उपयोग कर सकते हैं:

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

यह उत्तर अधिक उपयोगी है क्योंकि इसमें स्थैतिक (XML) और प्रोग्रामेटिक तरीका (JAVA) Kudos शामिल है।
chntgomez

9

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 21 पर छाया नहीं देगा, इसलिए आपको ऐसा ही करना होगा RoundRectDrawableWithShadow

ऐसा करने का एक बेहतर तरीका प्रतीत नहीं होता है।


2
हैकिंग के लिए +1 और मैं सहमत हूं। मुझे बेहतर समाधान नहीं मिल रहा है। वैसे भी मुझे आधिकारिक एपीआई में कुछ अलग होने की उम्मीद है।
गैब्रियल मैरीओटी

क्या यह वर्ग (RoundRectDrawableWithShadow या RoundRectDrawable) सुलभ है? मुझे ऐसा नहीं लगता
नेपोलियन

8

थोड़ा देर से यहाँ और आंशिक रूप से विषय के बाद से यह प्रोग्राम नहीं है, लेकिन मैं विजेट के लिए शैलियों को स्थापित करने के लिए सबसे अच्छा लगता है और आप ऐसा कर सकते हैं CardViewबस एक शैली बनाने के लिए यह आपके 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>

आपको अपडाउन के माध्यम से एंड्रॉइड स्टूडियो का उपयोग करके ऐप्पोमैट-वी 7 लाइब्रेरी को आयात करने की आवश्यकता है:

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

उम्मीद है की यह मदद करेगा। खुश कोडिंग


1
XML स्टाइल को इंगित करने के लिए धन्यवाद। उससे हमेशा जूझता रहा। वहाँ एक तरह से theme.xml में शैली को परिभाषित करने के लिए नहीं है? तब आपको प्रत्येक CardView के लिए शैली सेट नहीं करनी होगी।
Wirling

यह बहुत भयानक है - मैं यह समझने की कोशिश कर रहा था कि लेआउट के माध्यम से चयनकर्ताओं को कैसे प्रचारित किया जाए - और यह API21 काम नहीं कर रहा था। RIPLE ठीक पोस्ट API21 पर काम कर रहा था- लेकिन आपका थीम अप्रोच पहली बार था जब मैं कार्ड व्यू को कंटेंट पर क्लिक करने पर सही लुक देने में कामयाब रहा।
जिम एंड्रियास

ओपी ने हमें अपने प्रश्न की पहली पंक्ति में उस संपत्ति के बारे में बताया, उन्होंने कहा कि वह इसे "रात्रिभोज" हासिल करना चाहते हैं।
stramin

7

मैं एक recylerView में CardViews को स्वरूपित करने के साथ एक समान समस्या हो रही थी।

मुझे यह सरल समाधान काम कर रहा था, यकीन नहीं कि यह सबसे अच्छा समाधान है, लेकिन यह मेरे लिए काम करता है।

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

यह कार्ड व्यू का बैकग्राउंड ड्रॉबल हो जाता है और इसे टिंट करता है।



3

में जावा

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android ARGB रंगों का उपयोग करते हैं। आप इस तरह का उपयोग कर सकते हैं (0xFF + RGB रंग) - हार्ड-कोडेड रंग।


2

मैं एक ही मुद्दे पर क्रमिक रूप से एक कार्डव्यू बनाने की कोशिश करते हुए आया था, जो अजीब है कि डॉक्टर पर नजर डाल रहा है https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardCackackgroundColor%28int % 29 , Google लोगों ने कार्ड दृश्य की पृष्ठभूमि का रंग बदलने के लिए सार्वजनिक रूप से एपीआई किया लेकिन अजीब तरह से मैं समर्थन पुस्तकालय में इसे एक्सेस करने में सफल नहीं हुआ, इसलिए यहां मेरे लिए काम किया गया है:

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

ऐसा करना कि मैं कार्डव्यू छाया और गोल कोनों को रखने में सफल रहा।


आप इस तरह से अपने कार्डव्यू में एक एलएल जोड़ रहे हैं और निश्चित रूप से आप इसे कर सकते हैं, लेकिन यह मूल प्रश्न का उत्तर नहीं देता है।
गैब्रिएल मारीओटी

अनुरोध गतिशील रूप से कार्ड की पृष्ठभूमि के रंग को बदलने के बारे में था, और मुझे लगता है कि यह विधि केवल आंतरिक लेआउट पृष्ठभूमि के रंग को बदलकर बहुत सुंदर है। या क्या मैं कुछ न कुछ भूल रहा हूं।
मार्शल कोंवी

2

मुझे Xamarin पर समान समस्या मिली है। और थायराइड - VS (2017)

समाधान है कि मेरे लिए काम किया:

उपाय

अपनी 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" />

आप यह भी जोड़ सकते हैं cardElevationऔर cardElevation

यदि आप 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);

और अब आप पृष्ठभूमि का रंग बदल सकते हैं प्रोग्राम के रूप में खो सीमा, कोने की त्रिज्या और ऊंचाई के बिना।



1

यह कोटलिन में बहुत सरल है। कार्ड दृश्य रंग बदलने के लिए ColorStateList का उपयोग करें

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

ColorStateList का एक कोटलिन एक्सटेंशन:

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


0

Cardviewथोड़ा कोय है। मेरे पास संरचना में रंगों की सूची थी और मॉडल जैसा है

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
}

}

रंग से मॉडल लोड करें, निर्माण से अंतिम आइटम ले रहा है R.color

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

और अंतिम रूप से आप setBackgrıundResource सेट कर सकते हैं

 cv_add_goal_choose_color.setBackgroundResource(color)

0

मुझे आखिरकार रहने के लिए कोने मिल गए। यह c #, Xamarin.Android है

व्यूह फ़ोल्डर में:

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

एडाप्टर में:

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

0

कोटलिन में, मैं इस तरह पृष्ठभूमि का रंग बदलने में सक्षम था:

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

फिर यदि आप रंग निकालना चाहते हैं, तो आप ऐसा कर सकते हैं:

card.setCardBackgroundColor(Color.TRANSPARENT)

इस पद्धति का उपयोग करके मैं चयन एनीमेशन बनाने में सक्षम था।
https://gfycat.com/equalcarefreekitten


-1

कोशिश करो यह आसान काम करता है

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

ओपी ने हमें अपने प्रश्न की पहली पंक्ति में उस संपत्ति के बारे में बताया, उन्होंने कहा कि वह इसे प्रोग्रामेटिक / डायनामिकली हासिल करना चाहते हैं।
stramin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.