Установка поля программно в 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()
- Установите LinearlayoutId вашего ребенка карты
- Найти линейное расположение из findViewById.
Установить 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);