Змініть колір фону CardView програмно


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

Ці рішення не працюють, оскільки на картці є картаCornerRadius.

Відповіді:


266

Що ви шукаєте:

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

У XML

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

Оновлення: у XML

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

7
Здається, новий метод підтримки lib. Я не бачив його минулого місяця, можливо, це оновлення
— Габріеле Маріоти

5
Можливо, хочеться додати, що спосіб налаштування цього в XML єcard_view:cardBackgroundColor="@android:color/white"
— Mavamaarten

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
Як я можу програмно встановити Gradient Drawable на фон картки?
— Ghodasara Bhaumik

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

ОП розповідає нам про цю власність у першому рядку свого питання, він сказав, що хоче досягти цього "динамічно".
— страйм

25

Ви можете використовувати це в XML

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

або це на Java

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

EDIT

Це не дасть вам тіні на <API 21, тому вам доведеться робити те саме RoundRectDrawableWithShadow.

Не здається, що кращого способу це зробити.


2
+1 за злом, і я згоден. Я не можу знайти кращого рішення. У будь-якому випадку я сподіваюся на щось інше в офіційному API.
— Габріеле Маріоти

Чи доступний цей клас (RoundRectDravableWithShadow або RoundRectDravable)? Я не вважаю так
— Наполеан

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>

вам потрібно імпортувати бібліотеку appcompat-v7 за допомогою студії Android через gradle:

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

сподіваюся, що це допомагає. щасливе кодування


1
Дякуємо, що вказали на XML-стиль. Завжди бореться з цим. Чи не існує способу визначити стиль у themes.xml? Тоді вам не доведеться встановлювати стиль для кожного CardView.
— Вірлінг

Це досить приголомшливо - я намагався зрозуміти, як поширити селектори вниз через макет - і це не працювало до API21. Пульсація працювала чудово після публікації API21, але ваш тематичний підхід вперше мені вдалося отримати CardView, щоб правильно зрозуміти клацання вмісту.
— Джим Андреас

ОП розповідає нам про цю власність у першому рядку свого питання, він сказав, що хоче досягти цього "динамічно".
— страмін

7

У мене була подібна проблема із форматуванням CardViews в recylerView.

У мене це просте рішення працює, не впевнений, чи найкраще це рішення, але він працював на мене.

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

Він отримує фон Dravable of cardView і підфарбовує його.



3

В JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android використовують кольори ARGB. Ви можете використовувати так (0xFF + RGB COLOR) - жорсткий колір.


2

Я зіткнувся з тим же питанням, намагаючись програмно створити перегляд карт. Що дивно, це дивлячись на документ https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int % 29 , хлопці Google оприлюднили api, щоб змінити колір тла перегляду карти, але дивно, мені не вдалося отримати доступ до нього в бібліотеці підтримки, тому ось що для мене спрацювало:

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

Це мені вдасться зберегти тінь для перегляду картки та закруглені кути.


Ви додаєте LL у свій перегляд карт таким чином, і, звичайно, можете це зробити, але це не відповідає на початкове запитання.
— Габріеле Маріоти

Прохання стосувалося динамічної зміни кольору фону карти, і я думаю, що цей метод робить це досить просто, змінивши внутрішній колір тла макета. Або я щось пропускаю.
— Бойовий Конві

2

У мене така ж проблема у Xamarin.Android - 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 програмно, вам просто потрібно використовувати цей код: Для (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));

Розширення kotlin 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))

і, нарешті, ви можете встановитиBackgrıundResource

 cv_add_goal_choose_color.setBackgroundResource(color)

0

Нарешті я отримав куточки залишитися. Це c #, Xamarin.Android

у ViewHolder:

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

ОП розповідає нам про цю властивість у першому рядку свого питання, він сказав, що хоче досягти цього програмно / динамічно.
— страйм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.