约束布局:无法分隔元素并将它们全部保留在屏幕上

时间:2018-05-14 17:25:21

标签: android android-constraintlayout

我有一个简单的约束布局,如下所示:

<?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"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/main_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/rescan"
        />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/rescan"
        android:layout_width="wrap_content"
        android:text="@string/rescan_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintBottom_toBottomOf="parent"
        />

</android.support.constraint.ConstraintLayout>

尽管layout_constraintBottom_toTopOf="@id/rescan",列表视图可能会延伸到按钮的中途。

enter image description here

为了尝试纠正这个问题,我添加了硬编码尺寸(我不想这样做);到列表视图:

android:layout_marginBottom="50sp"

按钮:

android:layout_height="40sp"
android:textSize="20sp"
android:layout_margin="10sp"

然而,我得到了这个(模拟器图片,设计视图也对应于此):

enter image description here

按钮位于屏幕中间。

所以我决定删除硬编码的维度并使用屏障。 developer page对于barrierDirection的工作方式不明确,但this "constraintlayout.com" example使它清楚方向应该是你想要障碍的一侧与referenced_ids中列出的元素相关。基于此,这里是我在约束布局中的内容:

<ListView
    android:id="@+id/main_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bottomBarrier"
    />

<android.support.constraint.Barrier
    android:id="@+id/bottomBarrier"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:barrierDirection="top"
    app:constraint_referenced_ids="@id/rescan"
    />

<android.support.v7.widget.AppCompatButton
    android:id="@+id/rescan"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/rescan_button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    />     

但事情并没有真正好转......

enter image description here

这是不可能的,但这里的障碍是在最底层。这解释了为什么带有Bottom_toTopOf障碍的列表视图现在也一直延伸到底部。

然而,这使得整个障碍,谁的方向是top以及谁受约束的id是按钮,完全没有意义。在任何意义上,它都不会将列表视图保留在一侧而按钮保持在另一侧。它低于两者。

更加狂暴:如果我将方向更改为bottom并将其他所有内容保留为最终状态,则屏障会跳到最顶端,列表视图会从屏幕中间向上跳跃,按钮会保持原位。< / p>

我完全陷入困境。我最大的两个问题是:

  1. 为什么在第一张图片中,当按钮从底部到顶部设置时,列表视图是否会延伸到按钮的中间位置?

  2. 为什么,在最后一张图片中,是一个屏障,方向为&#34; top&#34;并参考按钮ID,下面按钮?

1 个答案:

答案 0 :(得分:1)

1。 您的ListView's高度设置为wrap_content,这意味着视图将计算自己的大小,而约束不会限制维度。 ConstraintLayout-1.1.0引入了允许使用wrap_content的新属性,但仍然强制执行限制以限制指定的维度。这些归因是:

app:layout_constrainedWidth="true"
app:layout_constrainedHeight="true"

2。 对于Barrier,您引用该视图ID的方式出现错误:

app:constraint_referenced_ids="@id/rescan"

这应该改为:

app:constraint_referenced_ids="rescan"