我有一个简单的约束布局,如下所示:
<?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"
,列表视图可能会延伸到按钮的中途。
为了尝试纠正这个问题,我添加了硬编码尺寸(我不想这样做);到列表视图:
android:layout_marginBottom="50sp"
按钮:
android:layout_height="40sp"
android:textSize="20sp"
android:layout_margin="10sp"
然而,我得到了这个(模拟器图片,设计视图也对应于此):
按钮位于屏幕中间。
所以我决定删除硬编码的维度并使用屏障。 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"
/>
但事情并没有真正好转......
这是不可能的,但这里的障碍是在最底层。这解释了为什么带有Bottom_toTopOf
障碍的列表视图现在也一直延伸到底部。
然而,这使得整个障碍,谁的方向是top
以及谁受约束的id是按钮,完全没有意义。在任何意义上,它都不会将列表视图保留在一侧而按钮保持在另一侧。它低于两者。
更加狂暴:如果我将方向更改为bottom
并将其他所有内容保留为最终状态,则屏障会跳到最顶端,列表视图会从屏幕中间向上跳跃,按钮会保持原位。< / p>
我完全陷入困境。我最大的两个问题是:
为什么在第一张图片中,当按钮从底部到顶部设置时,列表视图是否会延伸到按钮的中间位置?
为什么,在最后一张图片中,是一个屏障,方向为&#34; top&#34;并参考按钮ID,下面按钮?
答案 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"