30

在我的 Fragment 中,我有一个 ConstraintLayout,layout_height="wrap_content"我希望在视图底部的两个按钮之间留出一个边距。

当我将此边距添加layout_marginBottom到上部按钮(button_welcome_signup)时,它似乎工作正常。但是,如果我尝试将它添加到底部按钮(button_welcome_signin),因为layout_marginTop它不起作用。

有谁知道这里的问题是什么/如果我做错了什么?

(请注意,我使用 wrap_content 是有原因的,而且我很想使用底部按钮上的边距,所以我可以为其样式添加一些边距,以便在我的项目中获得更好的 UI 一致性)。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:MyAppApp="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:background="@color/white"
    android:minHeight="@dimen/min_height_welcome_frame"
    android:padding="@dimen/margin_all_frame_inner">

    <ImageView
        android:id="@+id/imageview_welcome_logo"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/logo_header"
        MyAppApp:layout_constraintTop_toTopOf="parent"
        MyAppApp:layout_constraintLeft_toLeftOf="parent"
        MyAppApp:layout_constraintRight_toRightOf="parent" />

    <TextView
        android:id="@+id/textiew_welcome_title"
        style="@style/MyAppTextViewTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_all_component_l"
        android:text="@string/welcome_title"
        MyAppApp:layout_constraintTop_toBottomOf="@id/imageview_welcome_logo" />

    <TextView
        android:id="@+id/textview_welcome_text"
        style="@style/MyAppTextViewText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/welcome_message"
        MyAppApp:layout_constraintTop_toBottomOf="@id/textiew_welcome_title" />

    <Button
        android:id="@+id/button_welcome_signin"
        style="@style/MyAppSubButton"
        android:layout_width="match_parent"
        android:layout_height="46dp"
        android:layout_marginTop="@dimen/margin_all_component_s" 
        android:text="@string/welcome_sign_in"
        MyAppApp:layout_constraintBottom_toBottomOf="parent" />

    <Button
        android:id="@+id/button_welcome_signup"
        style="@style/MyAppButton"
        android:layout_width="match_parent"
        android:layout_height="46dp"
        android:layout_marginTop="@dimen/margin_all_component_l"
        android:text="@string/welcome_sign_up"
        MyAppApp:layout_constraintBottom_toTopOf="@id/button_welcome_signin"
        MyAppApp:layout_constraintTop_toBottomOf="@id/textview_welcome_text"
        MyAppApp:layout_constraintVertical_bias="1" />

</android.support.constraint.ConstraintLayout>

样式.xml:

<style name="MyAppButton" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/button_selector_blue</item>
    <item name="android:textSize">@dimen/textsize_all_l</item>
    <item name="android:textColor">@color/white</item>
    <item name="fontFamily">@font/my_sans_serif_regular</item>
</style>

<style name="MyAppSubButton" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/button_selector_transparent</item>
    <item name="android:textSize">@dimen/textsize_all_l</item>
    <item name="android:textColor">@color/turquoise_blue</item>
    <item name="fontFamily">@font/my_sans_serif_regular</item>
</style>
4

8 回答 8

51

在 a 内ConstraintLayout,子视图的边距只有在该边被约束到另一个视图时才会生效。在您的原始示例中,顶部按钮的底部边距有效,因为顶部按钮具有底部约束:

MyAppApp:layout_constraintBottom_toTopOf="@id/button_welcome_signin"

但是,底部按钮的上边距不起作用,因为底部按钮对其顶部没有约束。

如果您想在底部按钮上使用上边距,请添加以下约束:

MyAppApp:layout_constraintTop_toBottomOf="@+id/button_welcome_signup"

请注意,您必须通过将此属性添加到顶部按钮来更新链样式(因为这个新约束创建了一个链):

MyAppApp:layout_constraintVertical_chainStyle="packed"
于 2018-01-03T18:24:39.340 回答
2

试试这个

<Button
    android:id="@+id/button_welcome_signin"
    style="@style/MyAppSubButton"
    android:layout_width="match_parent"
    android:layout_height="46dp"
    android:layout_marginTop="16dp"
    android:text="@string/welcome_sign_in"
    MyAppApp:layout_constraintBottom_toBottomOf="parent"
    MyAppApp:layout_constraintEnd_toEndOf="parent"
    MyAppApp:layout_constraintStart_toStartOf="parent"
    MyAppApp:layout_constraintTop_toBottomOf="@+id/button_welcome_signup" />
于 2018-01-03T18:14:43.550 回答
0

第一张图片在您的代码上被删除了边距,

在此处输入图像描述

第二张图片在左、右、上、下添加边距

在此处输入图像描述

于 2018-01-03T18:11:13.810 回答
0
<Button
        android:id="@+id/SaveBtnId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/Save"
        android:layout_marginTop="16dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginLeft="16dp"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginRight="16dp"
        app:layout_constraintRight_toRightOf="parent"
         />

在此处输入图像描述

于 2018-12-21T07:25:10.840 回答
0

我花了一段时间才弄清楚我在想这个错误的方式,所以也许它会帮助别人。

在 ConstraintLayout 中,它从约束中获得边距。

换句话说,假设您有两个相邻的按钮。

右边的那个被约束StartToEnd, TopToTop, 和BottomToBottom左边的那个。

如果你给正确的 a marginBottom,它不会把它下面的东西向下推,它会从第一个按钮的底部向上推。边距在它的底线和它所限制的东西的底线之间,而不是在屏幕上的所有视图之间。

于 2019-10-31T16:49:01.260 回答
0

如果有人遇到与我相同的问题,请尝试在另一个视图(即 ImageView)的底部将 View(RecyclerView) 作为 match_parent。但是即使我在我的 ImageView 高度大小的 RecyclerView 中放置了一个 top_margin,RecycleView 也与我的 ImageView 重叠。

解决方案:设置 - android:layout_height="0dp" - 非常适合我。解释如下。

MATCH_PARENT 不工作

<View
    android:id="@+id/view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"/>

任何视图都应应用其父 ViewGroup 的属性规则。ConstraintLayout 支持“0dp”值(match_constraint)而不是“match_parent”来获取匹配父行为。所以,永远不要在 ConstraintLayout 中使用“match_parent”!

我从这里... https://medium.com/@jemli.idea/constraintlayout-never-ever-97c121286100

于 2020-01-15T20:08:03.590 回答
0

我正在使用android:margin_verticalandroid:margin_top同时,这里margin_vertical优先。

android:margin问题也可能发生

于 2020-10-01T20:08:38.710 回答
-3

android:layout_marginTop="@dimen/_10sdp"

于 2021-06-23T05:47:13.830 回答