ScrollView в ConstrainLayout прокручивается неправильно - PullRequest
1 голос
/ 08 мая 2019

У меня есть этот макет:

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

    <android.support.constraint.Guideline
        android:id="@+id/bottomGuideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.95"/>


    <ImageView
        android:id="@+id/logo"
        android:layout_width="144dp"
        android:layout_height="52dp"
        android:layout_marginTop="16dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@id/tvTitle"
        app:layout_constraintVertical_chainStyle="packed"
        android:src="@drawable/ic_launcher_background"/>

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginTop="28dp"
        app:layout_constraintTop_toBottomOf="@+id/logo"
        app:layout_constraintStart_toStartOf="@id/btnGooglePlay"
        app:layout_constraintEnd_toEndOf="@id/btnGooglePlay"
        app:layout_constraintBottom_toTopOf="@id/tvText"
        app:layout_constraintVertical_chainStyle="packed"
        android:text="Title!"
        />

    <TextView
        android:id="@+id/tvText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="28dp"
        android:gravity="center"
        app:layout_constraintTop_toBottomOf="@id/tvTitle"
        app:layout_constraintStart_toStartOf="@id/btnGooglePlay"
        app:layout_constraintEnd_toEndOf="@id/btnGooglePlay"
        app:layout_constraintBottom_toTopOf="@id/scroll"
        app:layout_constraintVertical_chainStyle="packed"
        android:text="Many test about something.\nMany test about something Many test about something Many test about something"
        />

    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/tvText"
        app:layout_constraintStart_toStartOf="@id/btnGooglePlay"
        app:layout_constraintEnd_toEndOf="@id/btnGooglePlay"
        app:layout_constraintBottom_toTopOf="@id/btnGooglePlay"
        app:layout_constraintVertical_chainStyle="packed"
        >

        <LinearLayout
            android:id="@+id/containerFeature"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:orientation="vertical"/>

    </ScrollView>

    <android.support.v7.widget.CardView
        android:id="@+id/btnGooglePlay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:layout_marginStart="32dp"
        android:layout_marginEnd="32dp"
        app:layout_constraintBottom_toTopOf="@id/bottomGuideline"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:background="@color/colorPrimary"
        app:cardElevation="4dp"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="12dp"
            android:paddingBottom="12dp"
            android:background="@color/colorPrimary"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="Push this"
                android:textAllCaps="true"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:layout_gravity="center"
                android:text="some description"
                />

        </LinearLayout>



    </android.support.v7.widget.CardView>



</android.support.constraint.ConstraintLayout>

Я хочу, чтобы значок (R.id.logo) был ближе к центру, если в containerFeature не так много элементов.Как на этом рисунке:

this

и, если есть еще элементы, значок должен быть ближе к вершине:

this

но если есть много элементов, я ожидаю, что ScrollView будет работать.

И я увижу это:

this

Если я изменю атрибут ScrollViewlayout_height to "0dp" Я вижу, что все работает нормально, но иконка всегда работает и chainStyle="packed" не имеет для меня смысла.

Что я могу сделать, чтобы исправить поведение ScrollView с chainStyle="packed?

1 Ответ

1 голос
/ 08 мая 2019

По умолчанию, если для параметра View установлено значение wrap_content, его ограничения не применяются, когда он становится слишком большим для их удовлетворения.Чтобы изменить это поведение и обеспечить его применение, вам необходимо добавить app:layout_constrainedHeight="true" к вашей ScrollView.

Документации:

WRAP_CONTENT: применение ограничений (добавлено в 1.1)

Если для измерения установлено значение WRAP_CONTENT, в версиях до 1.1 они будут обрабатываться как буквальное измерение, то есть ограничения не будут ограничивать результирующее измерение.Хотя в целом этого достаточно (и быстрее), в некоторых ситуациях вы можете захотеть использовать WRAP_CONTENT, но продолжайте применять ограничения для ограничения результирующего измерения.В этом случае вы можете добавить один из соответствующих атрибутов:

app: layout_constrainedWidth = ”true | false”

app: layout_constrainedHeight = ”true | false”

...