每行都使用layout_constraintHeight_min的Flat ConstraintLayout不起作用

时间:2018-11-29 03:12:45

标签: android android-layout android-constraintlayout

我有一个很常见的用例:我在屏幕上有多行信息。我希望无需使用嵌套的ViewGroups就可以实现这些视图。每行应具有最小高度,但如果内容大于最小高度,则应进行扩展。内容应垂直嵌套。

似乎这个简化的示例应该起作用:

<?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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Row"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@+id/view"
        app:layout_constraintBottom_toBottomOf="@+id/view"/>

    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="#8800ff00"
        app:layout_constraintHeight_min="100dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="@id/textView"/>

</android.support.constraint.ConstraintLayout>

我没有为每一行创建一个ViewGroup,而是有一个带有约束的平面布局。每行的视图设置行高,并且可以单击。该行内的视图是布局层次结构中的同级,但在该行的View中间垂直居中。由于我已指定app:layout_constraintHeight_min并将视图的底部锚定在内容的底部,因此它应随内容一起增长。

但是有一个问题:

enter image description here

ConstraintLayout在行上方添加了不希望的间距!请注意,该行上方的多余间距等于内容底部和该行底部之间的正确间距。

我的理论是这样的:由于View的底部固定在内容(TextView)的底部,因此它希望紧紧地贴在它的底部并紧挨它。如果我强迫它向远处移动,它会添加一个类似于底部边距的图形,以实现此目的,它还会添加一个相似的顶部边距以对称。

如何使其停止?如果不是在顶部留有多余的空间,我将完全有所需。也许有一些特殊的ConstraintLayout技巧,一些神奇的属性可以解决此问题。也许有一种完全不同的方式可以使用ConstraintLayout完成我想要的UI。

我意识到使用固定高度的行将使这一过程变得更加简单,但是如果内容可以增加,我不喜欢这样做。

我可以将UI更改为每行具有一个嵌套的ConstraintLayout,但是在努力使复杂的布局完全平坦而没有多层ViewGroups之后,我不想这样做。但是,如果找不到更好的解决方案,那就是我会做的,希望在这里找到。

1 个答案:

答案 0 :(得分:0)

我认为删除最小高度并在TextView中添加一些边距将完成此操作,并且如果可能的话,可以使用约束代替

<?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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="50dp"
        android:text="Row is not column"
        android:textColor="#283858"
        app:layout_constraintBottom_toBottomOf="@+id/view"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/view"/>

    <View
        android:id="@+id/view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#8800ff00"
        app:layout_constraintBottom_toBottomOf="@id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Here is my output