我的XML布局中有一个CardView,我需要以编程方式设置它的边距(这是因为我不需要任何时候的边距)。基于一些条件,我要么设置要么删除边距)。
我是这样做的:

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

这很管用。它把2dp边距放在我CardView的底部。不过,我的日志里有这样一条:
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);

当我这样做时,我不会得到错误,但是它没有设置任何边距。
我应该忽略这个错误吗?只是看起来不对。
编辑:
以下是我的xmlCardView
<?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>

最佳答案

在您的案例中,您对谁是您的CardView的父级并不特别感兴趣,因为您只想更改保证金。所有*LayoutParams类都是MarginLayoutParams的直接/间接子类,这意味着您可以轻松地转换为MarginLayoutParams并对该对象执行更改:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) myCardView.getLayoutParams(); layoutParams.setMargins(0, 0, SystemHelper.dpToPx(2), 0); myCardView.requestLayout();

08-04 13:39