Змініть колір фону 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.