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
Два шага
Ответ 4
Попробуйте добавить нижнее ограничение в scrollview (например: app:layout_constraintBottom_toBottomOf="parent"
)
и изменить андроид: layout_height = "wrap_content" на android:layout_height="0dp"
Ответ 5
У вас есть два решения этой проблемы (одно и то же, но двумя способами):
Если вы включили Режим дизайна в Android Studio, выберите ScrollView и откройте вкладку атрибутов, а в layout_height выберите "match_constraint".
Если вы используете текстовый режим в 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
).