Установка поля программно в CardView

У меня есть CardView в моем XML-макете, и мне нужно задавать поля для него программно (это потому, что мне не требуется маржа всегда. На основании нескольких условий я либо устанавливаю, либо удаляю маржу).

Вот как я это сделал:

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

Это работало нормально. Это положил 2dp поле в нижней части моего CardView, Тем не менее, я получаю это в моем logcat:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

Итак, я изменился CardView.LayoutParams в FrameLayout.LayoutParams, как это:

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

И все же снова, это работает, но я получаю ту же ошибку, что и выше.

Поэтому я изменил его еще раз, чтобы использовать LinearLayout.LayoutParams,

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

Когда я делаю это, я не получаю ошибку, однако она не устанавливает никакого запаса.

Должен ли я просто игнорировать ошибку? Это просто не кажется правильным.

РЕДАКТИРОВАТЬ:

Вот мой CardView в 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>

4 ответа

Решение

В вашем случае вы не особенно заинтересованы, кто является родителем вашего CardViewпотому что единственное, что вы хотите изменить, это маржа. Все *LayoutParams классы прямые / косвенные дети MarginLayoutParamsЭто означает, что вы можете легко привести MarginLayoutParams и выполнить изменение этого объекта:



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

1) Установите параметры Cardview, чтобы он отображался программно

Установка параметров Carview

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

2) Установите параметры для отображения полей вокруг карты

Установка параметров для полей Cardview

ViewGroup.MarginLayoutParams cardViewMarginParams = (ViewGroup.MarginLayoutParams) cardView.getLayoutParams(); 
cardViewMarginParams.setMargins(0, 30, 0, 30);
cardView.requestLayout();  //Dont forget this line

Kotlin В kotlin набор полей макета из кода сложен.

      val cardView = CardView(context)
(cardView.layoutParams as? ViewGroup.MarginLayoutParams)?.leftMargin = 2
(cardView.layoutParams as? ViewGroup.MarginLayoutParams)?.bottomMargin = 2
cardView.requestLayout()
  1. Установите LinearlayoutId вашего ребенка карты
  2. Найти линейное расположение из findViewById.
  3. Установить LayoutParams

    LinearLayout linearLayout = (LinearLayout) myCardView.findViewById (R.id.linearlayoutid); LinearLayout.LayoutParams layoutParams = новый LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(30, 20, 30, 0);

Другие вопросы по тегам