web-dev-qa-db-fra.com

Définition de la marge par programmation sur CardView

J'ai une CardView dans ma mise en page XML et je dois lui définir des marges par programme (car je n'ai pas besoin de marge à tout moment. Sur la base de quelques conditions, je définis ou supprime la marge).

Voici comment je l'ai fait: 

CardView.LayoutParams layoutParams = (CardView.LayoutParams) myCardView.getLayoutParams();
layoutParams.setMargins(0, 0, SystemHelper.dpToPx(2), 0);
myCardView.setLayoutParams(layoutParams);

Cela a bien fonctionné. Il a mis 2dp margin au bas de ma CardView. Cependant, je reçois ceci dans mon logcat:

Java.lang.ClassCastException: Android.widget.LinearLayout$LayoutParams cannot be cast to Android.widget.FrameLayout$LayoutParams

J'ai donc changé CardView.LayoutParams en FrameLayout.LayoutParams, comme ceci:

FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) myCardView.getLayoutParams();
layoutParams.setMargins(0, 0, SystemHelper.dpToPx(2), 0);
myCardView.setLayoutParams(layoutParams);

Et encore une fois, cela fonctionne mais je reçois la même erreur que ci-dessus.

Je l'ai donc modifié une fois de plus pour utiliser LinearLayout.LayoutParams.

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) myCardView.getLayoutParams();
layoutParams.setMargins(0, 0, SystemHelper.dpToPx(2), 0);
myCardView.setLayoutParams(layoutParams);

Quand je fais cela, je ne reçois PAS l'erreur cependant il ne définit aucune marge

Devrais-je simplement ignorer l'erreur? Cela ne semble pas juste.

MODIFIER:

Voici ma CardView en XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:orientation="horizontal"
    Android:background="@Android:color/white"
    Android:minHeight="@dimen/item_min_height"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.CardView
        Android:id="@+id/cardViewAppointmentWeek"
        app:cardElevation="2dp"
        Android:layout_marginBottom="2dp"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <LinearLayout
            Android:orientation="horizontal"
            Android:background="?android:attr/selectableItemBackground"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">

            ...

        </LinearLayout>

    </Android.support.v7.widget.CardView>

</LinearLayout>
10

Dans votre cas, vous êtes pas spécifiquement intéressé par le parent de votre CardView, car la seule chose que vous souhaitez modifier est la marge. Toutes les classes *LayoutParams sont des enfants directs/indirects de MarginLayoutParams, ce qui signifie que vous pouvez facilement transtyper en MarginLayoutParams et effectuer des modifications sur cet objet:



    ViewGroup.MarginLayoutParams layoutParams = 
                           (ViewGroup.MarginLayoutParams) myCardView.getLayoutParams();
    layoutParams.setMargins(0, 0, SystemHelper.dpToPx(2), 0);
    myCardView.requestLayout();

24
azizbekian

1) Définissez les paramètres Cardview pour qu’il soit affiché par programme

Définition des paramètres de vue

CardView cardView = new CardView(context);
LinearLayout.LayoutParams cardViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);  
cardView.setLayoutParams(cardViewParams)

2) Définir les paramètres d'affichage des marges autour de la vue de la carte

Paramétrage des marges Cardview

ViewGroup.MarginLayoutParams cardViewMarginParams = (ViewGroup.MarginLayoutParams) cardView.getLayoutParams(); 
cardViewMarginParams.setMargins(0, 30, 0, 30);
cardView.requestLayout();  //Dont forget this line
2
fritz-playmaker
  1. Définissez LinearlayoutId votre enfant cardview 
  2. Trouver linearlayout à partir de findViewById.
  3. Set LayoutParams

    LinearLayout linearLayout = (LinearLayout) myCardView.findViewById (R.id.linearlayoutid); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams ( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins (30, 20, 30, 0);

0
redAllocator