プログラムで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をサポートする新しい方法のようです。私は先月それを見なかった、それは更新であるかもしれない
ガブリエレ・マリオッティ2014年

5
XMLでこれを設定するための方法があることを追加したい場合がありますcard_view:cardBackgroundColor="@android:color/white"
Mavamaarten

3
card_view名前空間を使用しても機能しませんapp。代わりに使用する必要があります。
rsicarelli 2016年

1
@rsicarelliすべては、その名前に依存します。– xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
ブライアンブライス

1
プログラムでグラデーションドローアブルをカードの背景に設定するにはどうすればよいですか?
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"
    >

OPは彼の質問の最初の行でその特性について私たちに話し、彼はそれを「普通に」達成したいと言った。
ストラミン

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)の称賛が含まれているため、この回答はより有用です。
chntgomez 2016年

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で何か違うことを望みます。
Gabriele Mariotti 2014年

このクラス(RoundRectDrawableWithShadowまたはRoundRectDrawable)はアクセス可能ですか?私はそうは思いません
ナポレアン2014年

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>

あなたはgradle経由でAndroidスタジオを使用してappcompat-v7ライブラリをインポートする必要があります:

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

お役に立てれば。幸せなコーディング


1
XMLスタイル設定を指摘していただきありがとうございます。いつもそれに苦労しています。themes.xmlでスタイルを定義する方法はありませんか?その後、各CardViewのスタイルを設定する必要はありません。
16年

それはかなり素晴らしいです-私はレイアウトを通してセレクターを下に伝搬する方法を理解しようとするのに苦労していました-そしてこれはAPI21以前では機能していませんでした。リップルはAPI21の後でうまく機能していましたが、テーマアプローチは、CardViewでコンテンツ全体をクリックして適切に表示できるようにしたのが初めてでした。
ジムアンドレアス

OPは彼の質問の最初の行でその特性について私たちに話し、彼はそれを「普通に」達成したいと言った。
ストラミン

7

RecylerViewでCardViewをフォーマットする際に同様の問題がありました。

私はこのシンプルなソリューションを機能させましたが、それが最良のソリューションであるかどうかはわかりませんが、私にとってはうまくいきました。

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

cardViewの背景のDrawableを取得し、色を付けます。



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を追加しますが、もちろんそれを実行できますが、元の質問には答えられません。
Gabriele Mariotti 14年

要求はカードの背景色を動的に変更することでした、そして私はこの方法は内部のレイアウトの背景色を変更することによってかなり簡単にそれを行うと思います。または私は何かが欠けていますか?
Martial Konvi 2014年

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 プログラムで編集する場合は、次のコードを使用する必要があります:For(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

Kotlinでは非常にシンプルです。ColorStateListを使用してカードの表示色を変更する

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

ColorStateListのkotlin拡張:

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

1

私にとって最も簡単な方法はこれです(Kotlin)

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

そして最後に、あなたは設定することができます

 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は彼の質問の最初の行でそのプロパティについて教えてくれ、彼はプログラム的に/通常的にそれを達成したいと言った。
ストラミン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.