Scrollview внутри шаблона ограничений не прокручивается до нижней части родительского ограничения

У меня есть форма, которая имеет около 12/13 полей. Я использовал Scrollview внутри макета ограничения. Ниже представлена ​​иерархия XML-макета. Проблема в том, что она не прокручивается вниз, а прокручивает только до первых начальных 10 представлений. Последние 3 поля скрываются, так как представление больше не прокручивается.

СРОК РОДИТЕЛЯ

<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:id="@+id/activity_register"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:orientation="vertical">

<!-- Textview and a button -->

  <ScrollView
    android:id="@+id/scrollView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:orientation="vertical"
    android:overScrollMode="never"
    android:scrollbars="none"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/view"
    tools:layout_constraintBottom_creator="1"
    tools:layout_constraintLeft_creator="1"
    tools:layout_constraintRight_creator="1"
    tools:layout_constraintTop_creator="1"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="0dp">


  <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

                <!-- Child Views (12/13 views of the fields)-->

  </android.support.constraint.ConstraintLayout>

</ScrollView>

</android.support.constraint.ConstraintLayout>

Ответ 1

Этот макет работает в моем приложении. Хитрость заключается в том, чтобы установить эти два атрибута в ScrollView: андроид: layout_height = "0dp" Приложение: layout_constraintBottom_toBottomOf = "родитель"

Упрощенный макет из моего приложения:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:theme="@style/ThemeOverlay.AppCompat.Light">

    <RelativeLayout
        android:id="@+id/linear"
        android:layout_width="0dp"
        android:layout_height="56dp"
        android:background="@color/title"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

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

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

            <TextView
                android:id="@+id/titleView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                android:text="@string/title"
                android:textSize="14sp"
                app:layout_constraintBaseline_toBaselineOf="@+id/title"
                app:layout_constraintLeft_toLeftOf="parent" />

            <EditText
                android:id="@+id/title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:layout_marginRight="8dp"
                android:hint="toilet title"
                android:inputType="text"
                android:textColor="@android:color/holo_red_dark"
                android:textSize="12sp"
                app:layout_constraintLeft_toLeftOf="@+id/open_hour"
                app:layout_constraintLeft_toRightOf="@+id/titleView"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
            ...
            Other Views in ScrollView
            ...
        </android.support.constraint.ConstraintLayout>
    </ScrollView>
</android.support.constraint.ConstraintLayout>

Ответ 2

В моем случае NestedScrollView работал вместо ScrollView. Ниже приведен фрагмент моего рабочего макета:

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

    <!-- Some Views Here -->

    <android.support.v4.widget.NestedScrollView
        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/view">

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

            <!-- Some Views That can be Scrolled Here -->

        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

</android.support.constraint.ConstraintLayout>

Ответ 3

Два шага

  • Сохранить высоту раскладки для прокрутки android:layout_height="0dp"

  • Опять для просмотра прокрутки
    android:fillViewport="true"

Ответ 4

Попробуйте добавить нижнее ограничение в scrollview (например: app:layout_constraintBottom_toBottomOf="parent") и изменить андроид: layout_height = "wrap_content" на android:layout_height="0dp"

Ответ 5

У вас есть два решения этой проблемы (одно и то же, но двумя способами):

  1. Если вы включили Режим дизайна в Android Studio, выберите ScrollView и откройте вкладку атрибутов, а в layout_height выберите "match_constraint".

  2. Если вы используете текстовый режим в Android Studio, используйте это:

    <ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tb_details">
    

Обратите внимание, что высота ScrollView установлена в 0dp. Оба эти способа решают одну и ту же проблему, но это разные способы сделать это.

ScrollView не является корневым представлением, у меня есть макет ограничения, оборачивающий ScrollView, как и вы.

Ответ 6

В моем случае NestedScrollView работал вместо ScrollView.

Ниже приведен фрагмент моего рабочего макета: Пожалуйста, убедитесь, что у вас нет высоты дочернего вида, чтобы соответствовать родительскому (0 dp) внутри constrianlayout, также для представления прокрутки android: fillViewport = "true;

Спросите меня, если возникнут какие-либо сомнения.

<android.support.v4.widget.NestedScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/_90sdp"
        android:fillViewport="true">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:id="@+id/cvLayout"
            android:animateLayoutChanges="true">

Ответ 7

Просто поместите android:fillViewport="true" в родительский макет

Ответ 8

В моем случае у меня был высокий TextView (высота установлена на wrap_content) внутри ScrollView (высота установлена на 0dp и ограничена сверху и снизу). Никакие предложения не сработали, но я решил проблему, обернув TextView внутри FrameLayout (высота установлена на wrap_content).