Android ConstraintLayout:视图不遵守边距

时间:2019-06-28 16:04:28

标签: android xamarin.android android-constraintlayout

我正在尝试创建一种布局,其中各种数据都由一条线(“视图”)分开,但是设计要求与该行的顶部和底部间距相等。我正在尝试使用边距来完成此操作,但是我没有得到预期的结果。基于official documentation,只要为边距方向设置了约束,就应该遵守它们。出于某种原因,上边距为我们提供了正确的间距,但是下边距根本没有给出任何间距。我创建了一个示例,其中仅包含要重现的相关布局axml,以及足够大的空间以可视化该问题:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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="match_parent"
    android:padding="20dp">
    <TextView android:text="NAME"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/account_name_label"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
    <TextView android:text="Your Name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/account_name"
        app:layout_constraintTop_toBottomOf="@+id/account_name_label"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />
    <View
        android:id="@+id/line1"
        app:layout_constraintTop_toBottomOf="@+id/account_name"
        app:layout_constraintBottom_toTopOf="@+id/account_joined_label"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:background="#000000"
        android:layout_marginTop="100dp"
        android:layout_marginBottom="100dp"
        />
    <TextView android:text="JOINED"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/account_joined_label"
        app:layout_constraintTop_toBottomOf="@+id/line1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />
    <TextView android:text="January 1, 2019"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/account_joined"
        app:layout_constraintTop_toBottomOf="@+id/account_joined_label"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />
</android.support.constraint.ConstraintLayout>

以上结果直观地显示了以下内容: ConstraintLayout margin issue

现在,我可以将android:layout_marginTop="100dp"添加到行视图之后的第一个TextView中以“修复”此问题,但是我想为行视图重用样式,而不必担心记住添加顶部在View行之后的第一个View的边距。我想念什么?

更新:布局应如下所示:

ConstraintLayout corrected layout

2 个答案:

答案 0 :(得分:2)

您需要将account_joined的底部连接到父级的底部,将account_joined_label的底部连接到account_joined的顶部。因此,您可以尝试以下方法:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        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="match_parent"
        android:padding="20dp">

    <TextView android:text="NAME"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:id="@+id/account_name_label"
              app:layout_constraintTop_toTopOf="parent"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView android:text="Your Name"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:id="@+id/account_name"
              app:layout_constraintTop_toBottomOf="@+id/account_name_label"
              app:layout_constraintRight_toRightOf="parent" />

    <View
            android:id="@+id/line1"
            app:layout_constraintTop_toBottomOf="@+id/account_name"
            app:layout_constraintBottom_toTopOf="@+id/account_joined_label"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="#000000"
            android:layout_marginTop="100dp"
            android:layout_marginBottom="100dp"/>

    <TextView android:text="JOINED"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:id="@+id/account_joined_label"
              app:layout_constraintTop_toBottomOf="@+id/line1"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintBottom_toTopOf="@+id/account_joined" />

    <TextView android:text="January 1, 2019"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:id="@+id/account_joined"
              app:layout_constraintTop_toBottomOf="@+id/account_joined_label"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

答案 1 :(得分:1)

代码前的一些信息:

使用android:layout_marginTop="100dp"之类的东西时,您的布局将变为无响应的布局。

为什么::在android中,不同的手机屏幕尺寸不同,在一部具有100dp裕度的设备上看起来不错,在另一台设备上看起来不好。

因此,如果可能的话,尽量不要将大值用作固定大小,问题的下一部分将说明如何处理。


这是乐趣的开始:

您只需使用Guidelines来解决您的保证金问题-它会响应所有屏幕尺寸,并且不会像120dp那样具有硬编码值。

您要做的就是将“ NAME”约束到顶部约束,将“ JOINED”约束到底部约束,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<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">

<TextView
    android:id="@+id/account_name_label"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:text="NAME"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline9" />

<TextView
    android:id="@+id/account_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:text="Your Name"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/account_name_label" />

<View
    android:id="@+id/line1"
    android:layout_width="0dp"
    android:layout_height="1dp"
    android:layout_marginStart="8dp"
    android:background="#000000"
    app:layout_constraintBottom_toTopOf="@+id/account_joined_label"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/account_name" />

<TextView
    android:id="@+id/account_joined_label"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:text="JOINED"
    app:layout_constraintBottom_toTopOf="@+id/guideline8"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<TextView
    android:id="@+id/account_joined"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:text="January 1, 2019"
    app:layout_constraintBottom_toTopOf="@+id/account_joined_label"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<android.support.constraint.Guideline
    android:id="@+id/guideline8"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.85" />

<android.support.constraint.Guideline
    android:id="@+id/guideline9"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.15" />

</android.support.constraint.ConstraintLayout>

它看起来像这样:

enter image description here

现在不要害怕,您的布局看起来还不错-这只是我la脚的编辑照片技巧(请在您的设备上选中)。

重要的是,您可以通过更改准则中此行的值来更改布局的外观:

 app:layout_constraintGuide_percent="0.15"

如果有什么不明白的地方,随时问。