4

У меня есть проблема с использованием ScrollView внутри ConstraintLayout (constraint-layout:1.0.0-beta3)Нижняя часть ScrollView обрезается при использовании ConstraintLayout

содержание моего ScrollView не показали полностью.

Вот мой макет:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_test" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     android:background="#212121"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Constraint Layout" 
      android:textSize="45sp"/> 

    </LinearLayout> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_constraintTop_toBottomOf="@+id/header" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <Button 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="BUTTON" 
       android:layout_marginTop="800dp"/> 


     </LinearLayout> 

    </ScrollView> 

</android.support.constraint.ConstraintLayout> 

И вот результат

enter image description here

Как вы можете видеть, кнопка не видна, и я достиг дна моего ScrollView.

Он хорошо работает с LinearLayout с макетом ниже

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/activity_test" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:background="#212121"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Linear Layout" 
      android:textSize="45sp"/> 

    </LinearLayout> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <Button 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="BUTTON" 
       android:layout_marginTop="800dp"/> 


     </LinearLayout> 

    </ScrollView> 

</LinearLayout> 

И результат

enter image description here

С LinearLayout конец ScrollView достижим.

Есть ли ошибка с ConstraintLayout или я сделал что-то неправильно?

+1

Этот 'android: layout_marginTop =" 800dp "' на кнопке выглядит немного отрывочным ... Вы хотите, чтобы кнопка всегда показывалась на в нижней части экрана и надпись «ScrollView» сидит поверх этого? –

+0

Этот marginTop является примером, чтобы заставить Button быть видимым только после прокрутки до нижней части ScrollView. Я хотел проиллюстрировать поведение крошечным примером. – guillaume

ответ

5

Как я сделал бы это:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/activity_test" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/header" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:background="#212121" 
     android:text="Constraint Layout" 
     android:textSize="45sp" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <ScrollView 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:fillViewport="true" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/header"> 

     <android.support.constraint.ConstraintLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <Button 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:text="BUTTON" 
       app:layout_constraintBottom_toBottomOf="parent" 
       app:layout_constraintLeft_toLeftOf="parent" 
       app:layout_constraintRight_toRightOf="parent" /> 

     </android.support.constraint.ConstraintLayout> 

    </ScrollView> 

</android.support.constraint.ConstraintLayout> 

Что дает:

enter image description here

несколько вещей, чтобы иметь в виду:

  • вы этого не делают вам нужно использовать linearlayout для заголовка, вы можете просто использовать textview напрямую.
  • не использовать match_parent, он может показаться сработавшим, но не определено. Вместо этого используйте 0dp с правильными ограничениями, чтобы растянуть представление по своему усмотрению.
  • ясно, не используйте поле 800dp. Он может выглядеть нормально на вашем конкретном экране, но не даст вам то, что вы хотите на разных устройствах.
  • scrollview по умолчанию будет обертывать его содержимое - атрибут fillViewport здесь, чтобы сделать это, занимает указанное пространство
  • вы можете использовать вложенный ConstraintLayout, когда это имеет смысл. В будущем мы также можем воспользоваться этим, чтобы сделать некоторые улучшения производительности.
+0

Спасибо за уточнения :) – guillaume

0

Я изменил высоту ScrollView на match_parent и добавил нижнее ограничение. Казалось, что он работает правильно.

<ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/header" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent"> 

Примечание: Имея высоту wrap_content на вертикально прокруткой зрения, как правило, не заканчивается хорошо, в любом макете.

+0

Действительно, моя проблема исходила оттуда. Спасибо! – guillaume

+0

На самом деле - match_parent НЕ поддерживается в ConstraintLayout, поэтому он не будет делать то, что вы думаете. Может показаться, что это работает в вашем примере, но, вероятно, он будет поврежден на других устройствах. Вы можете ** копировать поведение match_parent, но вы должны явно определить ограничения. См. Http://stackoverflow.com/questions/40633299/android-constraint-layout-strange-behavior/40662039#40662039 –

+0

@NicolasRoard Мне нужно было сделать обе вещи - установить высоту 'match_parent' и добавить нижнее ограничение - - чтобы макет был правильным. Выполнение одного или другого не было достаточным. –