Android中的CardView没有';t尊重ConstraintLayout中的约束

Android中的CardView没有';t尊重ConstraintLayout中的约束,android,android-cardview,cardview,android-constraintlayout,Android,Android Cardview,Cardview,Android Constraintlayout,我试图将CardView放置在约束图中,两边都有特定的边距 我将CardView页边距设置为与父级(左侧和右侧)相比,然后将layout_width设置为0dp:它将扩展并占用所有可用空间,忽略页边距 相反,如果我将CardView放在FrameLayout中,然后对FrameLayout应用相同的精确约束,FrameLayout将尊重这些约束,并且CardView将正好适合它(请参见下面的代码) 因此,我按照我需要的方式工作,但我想了解为什么CardView在计算其自身宽度时不考虑边距,设

我试图将CardView放置在约束图中,两边都有特定的边距

我将CardView页边距设置为与父级(左侧和右侧)相比,然后将layout_width设置为0dp:它将扩展并占用所有可用空间,忽略页边距

相反,如果我将CardView放在FrameLayout中,然后对FrameLayout应用相同的精确约束,FrameLayout将尊重这些约束,并且CardView将正好适合它(请参见下面的代码)



因此,我按照我需要的方式工作,但我想了解为什么CardView在计算其自身宽度时不考虑边距,设置为0dp。

在CardView中,您可能会看到以下示例:

<android.support.v7.widget.CardView
    android:layout_width="0dp"
    android:layout_height="186dp"
    android:layout_marginLeft="12dp"
    android:layout_marginRight="12dp"
    android:layout_marginTop="8dp"
    android:alpha=".5"
    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardBackgroundColor="@android:color/black"
    app:cardCornerRadius="4dp"
    app:constraintSet="@dimen/spacing_normal"
    app:contentPaddingBottom="@dimen/spacing_double"
    app:contentPaddingTop="@dimen/spacing_double"
    app:elevation="@dimen/cardview_default_elevation"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:layout_constraintLeft_creator="1"
    tools:layout_constraintRight_creator="1"
    tools:layout_constraintTop_creator="1" />


只需让我知道CardView中设置从侧面的距离的结果,您可能会看到以下示例:

<android.support.v7.widget.CardView
    android:layout_width="0dp"
    android:layout_height="186dp"
    android:layout_marginLeft="12dp"
    android:layout_marginRight="12dp"
    android:layout_marginTop="8dp"
    android:alpha=".5"
    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardBackgroundColor="@android:color/black"
    app:cardCornerRadius="4dp"
    app:constraintSet="@dimen/spacing_normal"
    app:contentPaddingBottom="@dimen/spacing_double"
    app:contentPaddingTop="@dimen/spacing_double"
    app:elevation="@dimen/cardview_default_elevation"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:layout_constraintLeft_creator="1"
    tools:layout_constraintRight_creator="1"
    tools:layout_constraintTop_creator="1" />


请告诉我结果。

它不起作用的原因是它需要layout_Margined和layout_marginStart,而不是layout_marginLeft和layout_marginRight


默认情况下,这些似乎会添加到FrameLayout,但不会添加到CardView。

它不起作用的原因是它需要layout\u Margined和layout\u marginStart,而不是layout\u marginLeft和layout\u marginRight


默认情况下,这些视图似乎会添加到FrameLayout,但不会添加到CardView。

我找到了一种方法,可以在不添加其他视图的情况下实现这一点。只需在onStart或onCreateView方法中添加以下行:

getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

如果您想知道为什么会这样,那是因为DialogFragment采用布局的父视图(在本例中为ConstraintLayout)并将其宽度和高度设置为包裹内容。这会覆盖它。

我找到了一种方法,可以在不添加其他视图的情况下实现此功能。只需在onStart或onCreateView方法中添加以下行:

getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

如果您想知道为什么会这样,那是因为DialogFragment采用布局的父视图(在本例中为ConstraintLayout)并将其宽度和高度设置为包裹内容。这会覆盖它。

这不是只会改变编辑器中的位置吗?这就是我对“工具”名称空间的理解我编辑我的文章是因为我必须在其中添加一些东西,它是有效的。检查它,我测试了它,左边和右边的空白都很有效。你的解决方案对我不起作用,对不起。这和我最初放在布局中的代码是一样的,还有一些我不需要的东西。但是我发现它不起作用的原因是它需要layout_margined和layout_marginart,而不是layout_marginLeft和layout_marginRight。这与Android studio生成的代码是一样的,它的约束条件不会改变编辑器中的位置吗?这就是我对“工具”名称空间的理解我编辑我的文章是因为我必须在其中添加一些东西,它是有效的。检查它,我测试了它,左边和右边的空白都很有效。你的解决方案对我不起作用,对不起。这和我最初放在布局中的代码是一样的,还有一些我不需要的东西。但是我发现它不起作用的原因是它需要layout_Margined和layout_marginStart,而不是layout_marginLeft和layout_marginRight。这是Android studio生成的相同代码,它的约束layout_marginLeft和layout_marginRight与开始和结束相同,因此,我不认为这可以解决问题。layout_marginLeft和layout_marginRight与start和end相同,因此我不认为这可以解决问题。