Измените цвет фона CardView программно


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

13 96

13 ответов:

то, что вы ищете это:

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

в XML

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

используйте свойство 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"
    >

Вы можете использовать это в XML

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

или это в Java

cardView.setCardBackgroundColor(Color.WHITE);

я использовал этот код для установки программно:

card.setCardBackgroundColor(color);

или в XML вы можете использовать этот код:

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

немного поздно здесь и частично вне темы, так как это не программно, но я считаю, что лучше всего настроить стили для виджетов, и вы можете сделать это для 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'
 }

надеюсь, что это помогает. счастливый кодирование

то, как он установлен в 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

это не даст вам тень на RoundRectDrawableWithShadow.

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

я столкнулся с той же проблемой при попытке создать 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"/>

делая это, мне удается сохранить тень cardview и закругленные углы.

In JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

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

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

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

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

он получает фон Drawable cardView и оттеняет его.

вы можете использовать это в Java.

cardView.setCardBackgroundColor (цвет.parseColor("#cac8a0"));

форма цвета кода http://www.color-hex.com/

для тех, кто задается вопросом, откуда взялось это имя "card_view".... На самом деле это пространство имен, и таким образом, вы можете создать его ...

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="230dp"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="2dp"
    card_view:cardPreventCornerOverlap="false"
    card_view:cardBackgroundColor="@color/cardview_1_background"
    card_view:contentPadding="0dp">

здесь вторая строка (с самого начала) создает пространство имен.. и последняя строка из последней-это xml-версия ответа на эту версию вопроса java. хаха Ура !

попробуйте, это работает легко

<android.support.v7.widget.CardView

card_view:cardBackgroundColor="#fff"

card_view:cardCornerRadius="9dp"
card_view:cardElevation="4dp"

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

android:paddingTop="10dp"
android:paddingBottom="10dp"

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

у меня такая же проблема на Xamarin.Андроид - против (2017)

The решение это сработало для меня:

решение

в 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программно вы просто нужно использовать этот код: (С#)

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

и теперь вы можете изменить цвет фона программно без потерянных границы, радиуса угла и высоты.