Программно изменить цвет фона 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);

Эти решения не работают, потому что на карте есть cardCornerRadius.

Ответы:


266

Вы ищете:

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

В XML

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

Обновление: в XML

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

7
Кажется, новый метод поддержки lib. Я не видел его в прошлом месяце, может быть это обновление
Габриэле Мариотти

5
Можно добавить, что способ настроить это в XMLcard_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"
    >

ОП сообщает нам об этом свойстве в первой строке своего вопроса, он сказал, что хочет добиться этого «динамически».
stramin

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

РЕДАКТИРОВАТЬ

Это не даст вам тени на <API 21, так что вам придется проделать то же самое с RoundRectDrawableWithShadow.

Похоже, лучшего способа сделать это нет.


2
+1 за взлом и согласен. Я не могу найти лучшего решения. В любом случае я надеюсь на что-то другое в официальном API.
Габриэле Мариотти

Доступен ли этот класс (RoundRectDrawableWithShadow или RoundRectDrawable)? Я так не думаю
Napolean

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 Studio через gradle:

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

надеюсь это поможет. счастливое кодирование


1
Спасибо, что указали на стиль XML. Всегда с этим борюсь. Нет способа определить стиль в themes.xml? Тогда вам не нужно было бы устанавливать стиль для каждого CardView.
Wirling

Это довольно круто - я изо всех сил пытался понять, как распространить селекторы вниз по макету - и это НЕ работало до API21. Рябь работала нормально после API21, но ваш подход к теме был первым, когда мне удалось заставить CardView давать правильный вид при нажатии на содержимое.
Джим Андреас

ОП сообщает нам об этом свойстве в первой строке своего вопроса, он сказал, что хочет добиться этого «динамически».
stramin

7

У меня была аналогичная проблема с форматированием CardViews в recylerView.

У меня работает это простое решение, я не уверен, что это лучшее решение, но оно сработало для меня.

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

Он получает фон Drawable для cardView и подкрашивает его.



3

В JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android использует цвета ARGB. вы можете использовать это так (0xFF + RGB COLOR) - Жестко заданный цвет.


2

Я столкнулся с той же проблемой, пытаясь программно создать cardview, что странно, так это то, что глядя на документ 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 в представление карты, и, конечно, вы можете это сделать, но это не отвечает на исходный вопрос.
Габриэле Мариотти

Запрос касался динамического изменения цвета фона карты, и я думаю, что этот метод делает это довольно просто, изменяя цвет фона внутреннего макета. Или я что-то упустил.
Martial Konvi

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

Котлинское расширение ColorStateList:

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

1

Самый простой способ для меня - это (Котлин)

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

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

В Kotlin я смог изменить цвет фона следующим образом:

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

OP сообщает нам об этом свойстве в первой строке своего вопроса, он сказал, что хочет добиться этого программно / динамически.
stramin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.