我正在尝试创建一种布局,其中各种数据都由一条线(“视图”)分开,但是设计要求与该行的顶部和底部间距相等。我正在尝试使用边距来完成此操作,但是我没有得到预期的结果。基于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>
现在,我可以将android:layout_marginTop="100dp"
添加到行视图之后的第一个TextView中以“修复”此问题,但是我想为行视图重用样式,而不必担心记住添加顶部在View行之后的第一个View的边距。我想念什么?
更新:布局应如下所示:
答案 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>
它看起来像这样:
现在不要害怕,您的布局看起来还不错-这只是我la脚的编辑照片技巧(请在您的设备上选中)。
重要的是,您可以通过更改准则中此行的值来更改布局的外观:
app:layout_constraintGuide_percent="0.15"
如果有什么不明白的地方,随时问。