Android中的CardView并不尊重ConstraintLayout

时间:2017-06-26 21:12:12

标签: android android-cardview cardview android-constraintlayout

我试图在一个ConstraintLayout中放置一个CardView,两边都有一个特定的边距。

我设置CardView边距与父母相比,左右两边,然后将layout_width设置为0dp:它将扩展并占用所有可用空间,忽略边距。

如果我将CardView放在FrameLayout中,然后将相同的约束应用于FrameLayout,则FrameLayout将尊重它们,而CardView将恰好适合它(参见下面的代码)。

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="...MyActivity...">
    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="32dp"
        android:layout_marginLeft="32dp"
        android:layout_marginRight="32dp"
        android:layout_marginStart="32dp"
        android:layout_marginTop="32dp"
        app:layout_constraintBottom_toTopOf="@+id/nextButton"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <android.support.v7.widget.CardView>
           <...omitted...>

所以我按照我需要的方式工作,但我想了解为什么在计算自己的宽度时,CardView没有考虑边距,设置为0dp。

3 个答案:

答案 0 :(得分:0)

在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" />

告诉我结果

答案 1 :(得分:0)

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

这些似乎默认添加到FrameLayout但不添加到CardView。

答案 2 :(得分:0)

我找到了一种无需添加其他视图即可完成此工作的方法。您只需要在onStart或onCreateView方法上添加以下行:

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

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