Changer la couleur d'arrière-plan de CardView par programmation
Le CardView a un attribut card_view:cardBackgroundColor
pour définir la couleur d'arrière-plan.
Cet attribut fonctionne bien.
En même temps, il n'y a pas de méthode pour changer la couleur dynamiquement.
Je viens d'essayer des solutions comme:
mCardView.setBackgroundColor(...);
Ou en utilisant une mise en page à l'intérieur du 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);
Ces solutions ne fonctionnent pas car la carte a un cardCornerRadius.
13 réponses
Ce que vous cherchez est:
CardView card = ...
card.setCardBackgroundColor(color);
En XML
card_view:cardBackgroundColor="@android:color/white"
Utilisez la propriété 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"
>
Vous pouvez l'utiliser en XML
card_view:cardBackgroundColor="@android:color/white"
Ou ceci en Java
cardView.setCardBackgroundColor(Color.WHITE);
J'ai utilisé ce code pour définir par programme:
card.setCardBackgroundColor(color);
Ou en XML, vous pouvez utiliser ce code:
card_view:cardBackgroundColor="@android:color/white"
Un peu en retard ici et partiellement hors sujet puisque ce n'est pas par programmation mais je trouve préférable de configurer des styles pour les Widgets et vous pouvez le faire pour un CardView
Il suffit de créer un style qui gardera votre XML plus propre...
<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>
Cela utilise android.support.v7.widget.CardView
Puis définir le style dans le fichier de mise en page:
<?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>
Vous devez importer la bibliothèque appcompat-V7 en utilisant Android studio via gradle:
dependencies {
compile 'com.android.support:appcompat-v7:22.2.0'
}
J'espère que cela aide. code heureux
La façon dont il est défini dans la méthode initialize
utilise la classe protected RoundRectDrawable
, comme ceci:
RoundRectDrawable backgroundDrawable = new RoundRectDrawable(backgroundColor, cardView.getRadius());
cardView.setBackgroundDrawable(backgroundDrawable);
Ce n'est pas joli, mais vous pouvez étendre cette classe. Quelque chose comme:
package android.support.v7.widget;
public class MyRoundRectDrawable extends RoundRectDrawable {
public MyRoundRectDrawable(int backgroundColor, float radius) {
super(backgroundColor, radius);
}
}
Puis:
final MyRoundRectDrawable backgroundDrawable = new MyRoundRectDrawable(bgColor,
mCardView.getRadius());
mCardView.setBackgroundDrawable(backgroundDrawable);
Modifier
Cela ne vous donnera pas l'ombre sur RoundRectDrawableWithShadow.
Il ne semble pas y avoir de meilleure façon de le faire.
Je suis tombé sur le même problème en essayant de créer un cardview par programme, ce qui est étrange, c'est que regarder le doc https://developer.android.com/reference/android/support/v7/widget/CardView.html#setCardBackgroundColor%28int%29, Les gars de Google ont rendu publique l'api pour changer la couleur d'arrière-plan d'une vue de carte, mais bizarrement je n'ai pas réussi à y avoir accès dans la bibliothèque de support, alors voici ce qui a fonctionné pour moi:
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"/>
Ce faisant, je réussis à garder l'ombre cardview et les coins arrondis.
Dans JAVA
cardView.setCardBackgroundColor(0xFFFEFEFE);
Android utiliser les couleurs ARGB. vous pouvez utiliser comme ceci(0xFF + couleur RVB) - couleur codée en dur.
J'avais un problème similaire avec le formatage CardViews dans un recylerView.
J'ai fait fonctionner cette solution simple, Je ne sais pas si c'est la meilleure solution, mais cela a fonctionné pour moi.
mv_cardView.getBackground().setTint(Color.BLUE)
Il obtient l'arrière-plan Drawable du cardView et le teinte.
Vous pouvez l'utiliser en java.
CardView.setCardBackgroundColor (couleur.parseColor ("#cac8a0"));
Le Code couleur de la forme http://www.color-hex.com/
Pour ceux qui se demandent d'où vient ce nom "card_view".... C'est en fait un espace de noms et de cette façon vous pouvez le créer ...
<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">
Ici, la deuxième ligne (du début) crée l'espace de noms.. et la dernière ligne de last est la version xml de la réponse de cette version java de question. haha santé !
Essayez cela fonctionne facilement
<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">
, j'ai le même problème sur Xamarin.Android-VS (2017)
La Solution qui a fonctionné pour moi:
SOLUTION
Dans votre fichier XML ajouter:
xmlns:card_view="http://schemas.android.com/apk/res-auto"
Et dans votre élément android.support.v7.widget.CardView
Ajoutez cette propriété:
card_view:cardBackgroundColor="#ffb4b4"
(c'est-à-dire)
<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" />
, Vous pouvez également ajouter cardElevation
et cardElevation
.
Si vous souhaitez modifier le cardview
par programmation vous avez juste besoin d'utiliser ce code:
Pour (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);
Et maintenant vous pouvez changer l'arrière-plan couleur par programmation sans bordure, rayon d'angle et élévation perdus.