我有一个很常见的用例:我在屏幕上有多行信息。我希望无需使用嵌套的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
并将视图的底部锚定在内容的底部,因此它应随内容一起增长。
但是有一个问题:
ConstraintLayout在行上方添加了不希望的间距!请注意,该行上方的多余间距等于内容底部和该行底部之间的正确间距。
我的理论是这样的:由于View的底部固定在内容(TextView)的底部,因此它希望紧紧地贴在它的底部并紧挨它。如果我强迫它向远处移动,它会添加一个类似于底部边距的图形,以实现此目的,它还会添加一个相似的顶部边距以对称。
如何使其停止?如果不是在顶部留有多余的空间,我将完全有所需。也许有一些特殊的ConstraintLayout技巧,一些神奇的属性可以解决此问题。也许有一种完全不同的方式可以使用ConstraintLayout完成我想要的UI。
我意识到使用固定高度的行将使这一过程变得更加简单,但是如果内容可以增加,我不喜欢这样做。
我可以将UI更改为每行具有一个嵌套的ConstraintLayout,但是在努力使复杂的布局完全平坦而没有多层ViewGroups之后,我不想这样做。但是,如果找不到更好的解决方案,那就是我会做的,希望在这里找到。
答案 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>