CardView'un arka plan rengini programlı olarak değiştirin


130

CardView bir özellik olan card_view:cardBackgroundColorarka plan rengi tanımlamak için kullanılır. Bu özellik iyi çalışıyor.

Aynı zamanda rengi dinamik olarak değiştirmenin bir yöntemi yoktur.

Şunun gibi çözümleri denedim:

mCardView.setBackgroundColor(...);

veya cardView içinde bir Düzen kullanarak

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

Bu çözümler işe yaramıyor çünkü kartta bir cardCornerRadius var.

Yanıtlar:


266

Aradığınız şey:

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

XML olarak

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

Güncelleme: XML'de

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

7
Destek kütüphanesinde yeni bir yöntem gibi görünüyor. Geçen ay görmedim, bir güncelleme olabilir
Gabriele Mariotti

5
Bunu XML'de yapılandırmanın yolunun şu olduğunu eklemek isteyebilirsinizcard_view:cardBackgroundColor="@android:color/white"
Mavamaarten

3
Ad card_viewalanını kullanmak benim için çalışmıyor, apponun yerine kullanmalıyım .
rsicarelli

1
@rsicarelli Her şey adını verdiğiniz şeye bağlı:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
Bryan Bryce

1
Gradient Drawable'ı programlı olarak kart arka planına nasıl ayarlayabilirim?
Ghodasara Bhaumik

115

Card_view: cardBackgroundColor özelliğini kullanın:

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

OP, sorusunun ilk satırında bize bu mülkten bahsetti, "dinamik" olarak elde etmek istediğini söyledi.
19:15 stramin

25

Bunu XML'de kullanabilirsiniz

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

veya bu Java'da

cardView.setCardBackgroundColor(Color.WHITE);

19

Bu kodu programlı olarak ayarlamak için kullandım:

card.setCardBackgroundColor(color);

Veya XML'de şu kodu kullanabilirsiniz:

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

Bu yanıt daha kullanışlıdır çünkü statik (XML) ve programatik yolu (JAVA) Tebrikler içerir.
chntgomez

9

initializeYöntemde ayarlanma şekli korumalı RoundRectDrawablesınıfı kullanır , örneğin:

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

Hoş değil ama bu sınıfı uzatabilirsin. Gibi bir şey:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

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

}

sonra:

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

DÜZENLE

Bu size <API 21'de gölge vermez, bu yüzden aynısını yapmanız gerekir RoundRectDrawableWithShadow.

Bunu yapmanın daha iyi bir yolu yok gibi görünüyor.


2
Hacking için +1 ve kabul ediyorum. Daha iyi bir çözüm bulamıyorum. Her neyse, resmi API'de farklı bir şey umuyorum.
Gabriele Mariotti

Bu sınıf (RoundRectDrawableWithShadow veya RoundRectDrawable) erişilebilir mi? Sanmıyorum
Napolean

8

Burada biraz geç ve kısmen konu dışı, çünkü bu programlı olarak değil, ancak Widget'lar için stil ayarlamayı en iyi buluyorum ve bunu CardViewsadece bir stil oluşturmak için yapabilirsiniz , xml'nizi daha temiz tutacaktır ...

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

bu kullanıyor android.support.v7.widget.CardView

ve sonra düzen dosyasında stili ayarlama:

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

appcompat-v7 kitaplığını gradle aracılığıyla Android stüdyosunu kullanarak içe aktarmanız gerekir:

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

Bu yardımcı olur umarım. mutlu kodlama


1
XML stiline işaret ettiğiniz için teşekkür ederiz. Hep bununla mücadele ediyor. Temalar.xml'de stili tanımlamanın bir yolu yok mu? O zaman her CardView için stil belirlemeniz gerekmez.
Wirling

Bu oldukça harika - seçicileri düzende nasıl ilerleteceğimi bulmaya çalışıyordum - ve bu API21 öncesi çalışmıyordu. Dalgalanma, API21 sonrası iyi çalışıyordu - ancak tema yaklaşımınız, içeriğe tıklamak için doğru görünümü vermek için CardView'ı ilk kez almayı başardım.
Jim Andreas

OP, sorusunun ilk satırında bize bu mülkten bahsetti, "dinamik" olarak elde etmek istediğini söyledi.
2019

7

Bir recylerView'da CardViews biçimlendirme ile benzer bir sorun yaşıyordum.

Bu basit çözümü çalıştırdım, bunun en iyi çözüm olup olmadığından emin değilim, ama benim için çalıştı.

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

CardView'ın arka planını çizebilir ve renklendirir.



3

In JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

android, ARGB renklerini kullanır. bunun gibi kullanabilirsiniz (0xFF + RGB COLOR) - Sabit kodlanmış renk.


2

Programlı bir şekilde bir kart görünümü oluşturmaya çalışırken aynı sorunla karşılaştım, tuhaf olan https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int belgesine bakmak. % 29 , Google adamları bir kart görünümünün arka plan rengini değiştirmek için API'yi kamuoyuna açıkladı, ancak tuhaf bir şekilde, destek kitaplığında ona erişmeyi başaramadım, işte benim için işe yarayan şey:

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

Bunu yaparak, kart görünüm gölgesini ve yuvarlak köşeleri korumayı başarıyorum.


Kart görünümünüze bu şekilde bir LL ekliyorsunuz ve elbette bunu yapabilirsiniz, ancak asıl soruyu yanıtlamaz.
Gabriele Mariotti

İstek, kartın arka plan rengini dinamik olarak değiştirmekti ve bence bu yöntem bunu oldukça basit bir şekilde iç düzen arka plan rengini değiştirerek yapıyor. Yoksa bir şey mi kaçırıyorum?
Martial Konvi

2

Xamarin.Android'de de aynı sorunu yaşıyorum - VS (2017)

Çözüm benim için çalıştı:

ÇÖZÜM

XML dosyanıza şunu ekleyin:

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

ve android.support.v7.widget.CardViewöğenize bu özelliği ekleyin:

card_view:cardBackgroundColor="#ffb4b4"

(Yani)

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

Ayrıca cardElevationve ekleyebilirsiniz cardElevation.

cardview Programlı olarak düzenlemek istiyorsanız, sadece şu kodu kullanmanız gerekir: (C #) için

    cvBianca = FindViewById<Android.Support.V7.Widget.CardView>(Resource.Id.cv_bianca);
    cvBianca.Elevation = 14;
    cvBianca.Radius = 14;
    cvBianca.PreventCornerOverlap = true;
    cvBianca.SetCardBackgroundColor(Color.Red);

Artık sınır, köşe yarıçapı ve yükseklik kaybı olmadan arka plan rengini programlı olarak değiştirebilirsiniz .



1

Kotlin'de çok basit. Kart görünümü rengini değiştirmek için ColorStateList'i kullanın

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

ColorStateList'in bir kotlin uzantısı:

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

1

Benim için en basit yol bu (Kotlin)

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

0

Cardviewbiraz çekingen. Yapımdaki renklerin listesi vardı ve Model şöyle

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
}

}

modeli renk ile yükleyin, yapıdaki son öğe R.color

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

ve son olarakBackgrıundResource'u ayarlayabilirsiniz.

 cv_add_goal_choose_color.setBackgroundResource(color)

0

Sonunda kalmak için köşeleri buldum. Bu c #, Xamarin.Android

ViewHolder'da:

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

Adaptörde:

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

0

Kotlin'de arka plan rengini şu şekilde değiştirebildim:

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

Ardından rengi kaldırmak isterseniz bunu yapabilirsiniz:

card.setCardBackgroundColor(Color.TRANSPARENT)

Bu yöntemi kullanarak bir seçim animasyonu oluşturabildim.
https://gfycat.com/equalcarefreekitten


-1

kolay çalıştığını dene

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

OP, sorusunun ilk satırında bize bu mülkü anlattı, bunu programlı / dinamik olarak elde etmek istediğini söyledi.
2019
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.