프로그래밍 방식으로 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 지원의 새로운 방법 인 것 같습니다. 지난 달에 보지 못했습니다. 업데이트 일 수 있습니다.
Gabriele Mariotti

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
프로그래밍 방식으로 그라디언트 드로어 블을 카드 배경으로 설정하려면 어떻게해야합니까?
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는 자신의 질문의 첫 번째 줄에서 그 부동산에 대해 알려주면서 "동적 인"자산을 달성하고 싶다고 말했다.
Stramin

25

이것을 XML로 사용할 수 있습니다

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

또는 이것은 자바에서

cardView.setCardBackgroundColor(Color.WHITE);

19

이 코드를 사용하여 프로그래밍 방식으로 설정했습니다.

card.setCardBackgroundColor(color);

또는 XML에서는 다음 코드를 사용할 수 있습니다.

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

이 답변은 정적 (XML) 및 프로그래밍 방식 (JAVA) Kudos를 포함하기 때문에 더 유용합니다.
chntgomez

9

initialize메소드에 설정된 방식은 다음 RoundRectDrawable과 같이 protected 클래스를 사용합니다 .

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

이 클래스 (RoundRectDrawableWithShadow 또는 RoundRectDrawable)에 액세스 할 수 있습니까? 나는 그렇게 생각하지 않습니다
나폴레옹

8

프로그래밍 방식이 아니기 때문에 위젯에 대한 스타일을 설정하는 것이 가장 좋으며 CardViewXML을 깔끔하게 유지하는 스타일을 만들기 위해이 작업을 수행 할 수 있습니다 .

<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의 스타일을 설정할 필요가 없습니다.
Wirling

레이아웃을 통해 선택기를 전파하는 방법을 알아 내려고 노력하고 있었으므로 API21 이전에는 작동하지 않았습니다. 잔물결은 API21 이후 잘 작동했지만 테마 접근 방식은 CardView가 처음으로 내용을 클릭하여 올바르게 볼 수 있도록하는 것이 었습니다.
Jim Andreas

OP는 자신의 질문의 첫 번째 줄에서 그 부동산에 대해 알려주면서 "동적 인"자산을 달성하고 싶다고 말했다.
Stramin

7

recylerView에서 CardViews를 포맷하는 것과 비슷한 문제가 발생했습니다.

이 간단한 솔루션이 작동하지만 최상의 솔루션인지 확실하지 않지만 저에게 효과적이었습니다.

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

cardView의 배경 Drawable을 가져와 색조를 나타냅니다.



3

에서 JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

안드로이드는 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"/>

그렇게하면 cardview 그림자와 둥근 모서리를 유지하는 데 성공합니다.


이 방법으로 카드보기에 LL을 추가하고 물론 할 수는 있지만 원래 질문에 대답하지는 않습니다.
Gabriele Mariotti

요청은 카드 배경색을 동적으로 변경하는 것이 었습니다.이 방법은 내부 레이아웃 배경색을 변경하여 간단하게 수행한다고 생각합니다. 아니면 뭔가 빠졌습니까?
무술 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" />

추가 할 수도 있습니다 cardElevationcardElevation .

프로그래밍 방식 으로 편집하려는 경우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))

마지막으로 BackgrıundResource를 설정할 수 있습니다

 cv_add_goal_choose_color.setBackgroundResource(color)

0

나는 마침내 코너를 유지했다. 이것은 C #, Xamarin입니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.