我正在尝试使用约束布局创建布局,顶部是ImageView,ImageView中有一个按钮,下面是TextView,然后是下面的另一个TextView。以下是xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardElevation="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/news_image1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="16:9"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="0dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toTopOf="@+id/news_title1"/>
<ImageButton
android:id="@+id/news_share_button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:src="@drawable/share_button_big"
app:layout_constraintBottom_toBottomOf="@+id/news_image1"
app:layout_constraintRight_toRightOf="@+id/news_image1"
android:layout_marginRight="15dp"
android:layout_marginEnd="15dp"/>
<TextView
android:id="@+id/news_title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="3"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@+id/news_image1"
app:layout_constraintBottom_toTopOf="@+id/news_read_more1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="@color/colorPrimaryText"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="12sp"
android:typeface="monospace" />
<TextView
android:id="@+id/news_read_more1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="1"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@+id/news_title1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/read_more_text_color"
android:text="@string/news_read_more"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="10sp" />
</android.support.constraint.ConstraintLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>
除了第一个ImageView顶部的小边距外,一切都是正确的。无论我做什么,我都无法摆脱这种差距。见下图。
请注意ImageView顶部和卡片之间的边距,这让我很烦恼。
答案 0 :(得分:3)
您的news_image
,news_title1
和news_read_more1
观点构成了一个链条。显然,虽然我找不到相关的文档,但垂直链中的所有视图都将共享垂直边距。换句话说,将layout_marginTop
或layout_marginBottom
属性应用于这三个视图中的一个将最终将其应用于所有三个。
你必须重新分配你的边距,记住这一点。
看起来这种行为比我想象的要复杂一些。首先,它看起来只适用于spread
“链式”(默认情况下)的视图。其次,看起来上边距应用于指定的视图以及上面的所有视图链中的那个视图,而底边距应用于指定的视图以及所有视图在下面链中的那个。最后,看起来边距是累积的(所以如果你的底部视图有10dp的上边距,中间视图上有20dp的上边距,最终结果将是你的顶视图30dp,中间视图30dp,你的10dp)底视图)。
至于在特定情况下如何解决这个问题?您应该可以使用左/右边距而不会出现问题。然后可能你应该在顶视图上使用底部边距来分隔三个视图。
Muthukrishnan的回答让我意识到你可以通过简单地从你的观点中删除链来解决这个问题。如果从ImageView中删除app:layout_constraintBottom_toTopOf="@+id/news_title1"
约束,则会破坏链,现在不会共享垂直边距。
答案 1 :(得分:1)
试试这个,我删除你的布局中的app:layout_constraintTop_toTopOf="parent"
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardElevation="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/news_image1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="16:9"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<ImageButton
android:id="@+id/news_share_button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:src="@drawable/ic_menu_share"
app:layout_constraintBottom_toBottomOf="@+id/news_image1"
app:layout_constraintRight_toRightOf="@+id/news_image1"
android:layout_marginRight="15dp"
android:layout_marginEnd="15dp"/>
<AliasTextView
android:id="@+id/news_title1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="3"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@+id/news_image1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="@color/colorPrimaryText"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="12sp"
android:typeface="monospace" />
<TextView
android:id="@+id/news_read_more1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="1"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@+id/news_title1"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/read_more_text_color"
android:text="@string/news_read_more"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="10sp" />
</android.support.constraint.ConstraintLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>
答案 2 :(得分:1)
感谢Ben P的出色启动,我设法找到了解决方案。 ConstraintLayout中有三种(加一种称重)链接样式。根据{{3}},链式样式解释为:
app:layout_constraintHorizontal_chainStyle=”spread”
app:layout_constraintVertical_chainStyle=”spread”
app:layout_constraintHorizontal_chainStyle=”spread_inside”
app:layout_constraintVertical_chainStyle=”spread_inside”
app:layout_constraintHorizontal_chainStyle=”packed”
app:layout_constraintVertical_chainStyle=”packed”
thelayout_constraintHorizontal_weight
和layout_constraintVertical_weight attributes
为每个视图指定重要性权重。如果您在线性布局中熟悉layout_weight
,则其工作方式相同。因此,具有最高权重值的视图获得最大的空间;具有相同权重的视图获得相同的空间量。 spread
是默认的链接样式。我将其更改为spread_inside
,以便将第一个和最后一个视图附加到链的每一端的约束上(因此服从所提供的边距)。 xml现在看起来像:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardElevation="4dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/news_image1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="16:9"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="0dp"
app:layout_constraintVertical_chainStyle="spread_inside"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toTopOf="@+id/news_title1"/>
<ImageButton
android:id="@+id/news_share_button_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:src="@drawable/share_button_big"
app:layout_constraintBottom_toBottomOf="@+id/news_image1"
app:layout_constraintRight_toRightOf="@+id/news_image1"
android:layout_marginRight="15dp"
android:layout_marginEnd="15dp"/>
<TextView
android:id="@+id/news_title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="3"
android:ellipsize="end"
app:layout_constraintVertical_chainStyle="spread_inside"
app:layout_constraintTop_toBottomOf="@+id/news_image1"
app:layout_constraintBottom_toTopOf="@+id/news_read_more1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:textColor="@color/colorPrimaryText"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="12sp"
android:typeface="monospace" />
<TextView
android:id="@+id/news_read_more1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|start"
android:layout_alignParentBottom="true"
android:lines="1"
android:ellipsize="end"
app:layout_constraintVertical_chainStyle="spread_inside"
app:layout_constraintTop_toBottomOf="@+id/news_title1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/read_more_text_color"
android:text="@string/news_read_more"
android:layout_margin="@dimen/news_cell0_textview_margin"
android:textSize="10sp" />
</android.support.constraint.ConstraintLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>