Thay đổi màu nền của CardView theo lập trình


130

Các CardView có một thuộc tính card_view:cardBackgroundColorđể xác định màu nền. Thuộc tính này hoạt động tốt.

Đồng thời không có phương pháp thay đổi màu sắc linh hoạt.

Tôi vừa thử các giải pháp như:

mCardView.setBackgroundColor(...);

hoặc sử dụng Bố cục bên trong 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);

Các giải pháp này không hoạt động vì thẻ có thẻCornerRadius.

Câu trả lời:


266

Những gì bạn đang tìm kiếm là:

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

Trong XML

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

Cập nhật: bằng XML

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

7
Có vẻ như một phương pháp mới trong hỗ trợ lib. Tôi đã không nhìn thấy nó vào tháng trước, có thể đó là một bản cập nhật
Gabriele Mariotti

5
Có thể muốn thêm rằng cách để định cấu hình này trong XML làcard_view:cardBackgroundColor="@android:color/white"
Mavamaarten

3
Sử dụng card_viewkhông gian tên không hiệu quả với tôi, tôi phải sử dụng appthay thế.
rsicarelli

1
@rsicarelli Tất cả phụ thuộc vào những gì bạn đặt tên:xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto"
Bryan Bryce

1
Làm cách nào tôi có thể đặt Gradient Drawable thành nền thẻ theo chương trình?
Ghodasara Bhaumik

115

Sử dụng thuộc tính 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 nói với chúng tôi về tài sản đó trong dòng đầu tiên của câu hỏi của anh ấy, anh ấy nói rằng anh ấy muốn đạt được nó "một cách tự nhiên".
stramin

25

Bạn có thể sử dụng điều này trong XML

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

hoặc cái này trong Java

cardView.setCardBackgroundColor(Color.WHITE);

19

Tôi đã sử dụng mã này để thiết lập chương trình:

card.setCardBackgroundColor(color);

Hoặc trong XML, bạn có thể sử dụng mã này:

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

Câu trả lời này hữu ích hơn vì chứa Kudos tĩnh (XML) và cách lập trình (JAVA).
chntgomez 22/03/2016

9

Cách nó được thiết lập trong initializephương thức sử dụng RoundRectDrawablelớp được bảo vệ , như vậy:

RoundRectDrawable backgroundDrawable = new RoundRectDrawable(backgroundColor, cardView.getRadius());
cardView.setBackgroundDrawable(backgroundDrawable);

Nó không đẹp, nhưng bạn có thể mở rộng lớp học đó. Cái gì đó như:

package android.support.v7.widget;

public class MyRoundRectDrawable extends RoundRectDrawable {

    public MyRoundRectDrawable(int backgroundColor, float radius) {
        super(backgroundColor, radius);
    }

}

sau đó:

final MyRoundRectDrawable backgroundDrawable = new MyRoundRectDrawable(bgColor,
            mCardView.getRadius());
mCardView.setBackgroundDrawable(backgroundDrawable);

BIÊN TẬP

Điều này sẽ không cung cấp cho bạn bóng trên <API 21, vì vậy bạn phải làm tương tự với RoundRectDrawableWithShadow.

Dường như không có cách nào tốt hơn để làm điều này.


2
+1 cho hack và tôi đồng ý. Tôi không thể tìm thấy một giải pháp tốt hơn. Dù sao, tôi hy vọng vào một cái gì đó khác nhau trong API chính thức.
Gabriele Mariotti

Lớp này (RoundRectDrawableWithShadow hay RoundRectDrawable) có thể truy cập được không? Tôi không nghĩ vậy
Napolean

8

Một chút muộn ở đây & một phần ngoài chủ đề vì đây không phải là lập trình nhưng tôi thấy tốt nhất là thiết lập các kiểu cho Widgets và bạn có thể làm điều này CardViewchỉ với việc tạo một phong cách, nó sẽ giữ cho xml của bạn sạch hơn ...

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

cái này đang sử dụng android.support.v7.widget.CardView

và sau đó thiết lập kiểu trong tệp bố cục:

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

bạn cần nhập thư viện appcompat-v7 bằng Android studio qua gradle:

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

hi vọng điêu nay co ich. mã hóa hạnh phúc


1
Cảm ơn đã chỉ ra kiểu dáng XML. Luôn luôn đấu tranh với điều đó. Có cách nào để xác định kiểu trong chủ đề không? Sau đó, bạn sẽ không phải đặt kiểu cho mỗi CardView.
Wirling

Điều đó khá tuyệt vời - tôi đã vật lộn với việc cố gắng tìm ra cách truyền bá các bộ chọn thông qua bố cục - và điều này KHÔNG hoạt động trước API21. Ripple đã hoạt động tốt bài API21- nhưng cách tiếp cận chủ đề của bạn là lần đầu tiên tôi quản lý để có được CardView để có cái nhìn đúng đắn khi nhấp vào nội dung.
Jim Andreas

OP nói với chúng tôi về tài sản đó trong dòng đầu tiên của câu hỏi của anh ấy, anh ấy nói rằng anh ấy muốn đạt được nó "một cách tự nhiên".
stramin

7

Tôi đã gặp vấn đề tương tự với định dạng CardViews trong recylerView.

Tôi đã làm cho giải pháp đơn giản này hoạt động, không chắc đó có phải là giải pháp tốt nhất không, nhưng nó hiệu quả với tôi.

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

Nó lấy nền Drawable của cardView và gợi ý nó.


4

Bạn có thể sử dụng dưới đây

cardview.setBackgroundColor(Color.parseColor("#EAEDED"));

Hoạt động tuyệt vời .....
Smack Alpha

3

Trong JAVA

cardView.setCardBackgroundColor(0xFFFEFEFE);

Android sử dụng màu ARGB. bạn có thể sử dụng như thế này (0xFF + RGB MÀU) - Màu sắc được mã hóa cứng.


2

Tôi đã gặp một vấn đề tương tự trong khi cố gắng tạo ra một chế độ xem thẻ theo chương trình, điều kỳ lạ là nhìn vào tài liệu https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int % 29 , Google đã công khai api để thay đổi màu nền của chế độ xem thẻ nhưng thật kỳ lạ là tôi đã không thành công khi truy cập vào thư viện hỗ trợ, vì vậy đây là những gì hiệu quả với tôi:

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

bộ lọc_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"/>

Làm điều đó tôi thành công trong việc giữ bóng cardview và các góc tròn.


Bạn đang thêm một LL trong cardview của bạn theo cách này và tất nhiên bạn có thể làm điều đó, nhưng nó không trả lời câu hỏi ban đầu.
Gabriele Mariotti

Yêu cầu là về việc thay đổi màu nền của thẻ một cách linh hoạt và tôi nghĩ phương pháp này thực hiện khá đơn giản bằng cách thay đổi màu nền bố cục bên trong. Hay tôi đang thiếu một cái gì đó.
Võ Konvi

2

Tôi đã gặp vấn đề tương tự trên Xamarin.Android - VS (2017)

Các giải pháp mà làm việc cho tôi:

GIẢI PHÁP

Trong tệp XML của bạn thêm:

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

và trong android.support.v7.widget.CardViewphần tử của bạn thêm sự sở hữu này:

card_view:cardBackgroundColor="#ffb4b4"

(I E)

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

Bạn cũng có thể thêm cardElevationcardElevation.

Nếu bạn muốn chỉnh sửa cardview chương trình, bạn chỉ cần sử dụng mã này: 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);

Và bây giờ bạn có thể thay đổi màu nền theo chương trình mà không bị mất đường viền, bán kính góc và độ cao.



1

Nó rất đơn giản trong kotlin. Sử dụng ColorStateList để thay đổi màu xem thẻ

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

Một phần mở rộng kotlin của ColorStateList:

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

1

Cách đơn giản nhất đối với tôi là cách này (Kotlin)

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

0

Cardviewlà một chút nhút nhát. Tôi đã có danh sách các màu trong cấu trúc của mình và Model giống như

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
}

}

tải mô hình với màu sắc, mục cuối cùng trên cấu trúc lấy từ R.color

 list.add(ModelColor(2, getString(R.string.orange), R.color.orange_500))

và cuối cùng bạn có thể thiết lậpBackgrıundResource

 cv_add_goal_choose_color.setBackgroundResource(color)

0

Cuối cùng tôi đã có những góc để ở lại. Đây là c #, Xamarin.Android

trong ViewHolder:

CardView = itemView.FindViewById<CardView>(Resource.Id.cdvTaskList);

Trong bộ chuyển đổi:

vh.CardView.SetCardBackgroundColor(Color.ParseColor("#4dd0e1"));

0

Trong Kotlin, tôi đã có thể thay đổi màu nền như thế này:

var card: CardView = itemView.findViewById(com.mullr.neurd.R.id.learn_def_card)
card.setCardBackgroundColor(ContextCompat.getColor(main,R.color.selected))

Sau đó, nếu bạn muốn loại bỏ màu, bạn có thể làm điều này:

card.setCardBackgroundColor(Color.TRANSPARENT)

Sử dụng phương pháp này tôi đã có thể tạo ra một hình ảnh động lựa chọn.
https://gfycat.com/equalcarefaletitten


-1

thử nó hoạt động dễ dàng

<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 nói với chúng tôi về tài sản đó trong dòng đầu tiên của câu hỏi của anh ấy, anh ấy nói rằng anh ấy muốn đạt được nó theo chương trình / bữa ăn.
stramin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.