Здесь происходят две важные вещи.
Во-первых, ваш ScrollView
указывает android:fillViewport="true"
.Это означает, что всякий раз, когда содержимое ScrollView «меньше», чем размер экрана, оно будет растягиваться для заполнения экрана.Другими словами, ваш wrap_content
ConstraintLayout фактически только обернет его содержимое , когда вам придется прокручивать.Во всех других случаях ваш ConstraintLayout будет функционально иметь высоту match_parent
.
Во-вторых, ограничения для вашего CardView, TextView и второго CardView образуют вертикальную цепочку .Цепи имеют особое поведение в отношении расстояния, когда родительский элемент больше, чем сумма представлений в цепочке (что связано с поведением fillViewport
, описанным выше);по умолчанию используется «распространение», при котором три вида будут расположены таким образом, чтобы все оставшееся пространство было равномерно разделено на четыре блока (один в начале цепочки, один между первыми двумя представлениями, один между вторыми двумя представлениями ипоследний в конце цепочки).
Как это исправить?
Лучше всего разорвать цепь .Предполагая, что вы просто хотите, чтобы все представления располагались один за другим, начиная с верхней части экрана, нет необходимости использовать цепочку.Чтобы разорвать цепочку, удалите нижнее ограничение из каждого представления:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
...>
<androidx.constraintlayout.widget.ConstraintLayout
...>
<androidx.cardview.widget.CardView
android:id="@+id/cv_title"
...
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
...
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tv_disclaimer"
...
app:layout_constraintTop_toBottomOf="@+id/cv_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.cardview.widget.CardView
android:id="@+id/cv_description"
...
app:layout_constraintTop_toBottomOf="@+id/tv_disclaimer"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
...
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
В качестве альтернативы, вы можете удалить атрибут fillViewport
из вашего ScrollView.Без этого дочерний объект ConstraintLayout никогда не растянется на весь экран, и wrap_content
будет означать, что между вашими цепочечными представлениями никогда не будет дополнительного пространства.