J'ai un formulaire qui a environ 12/13 champs. J'ai utilisé un Scrollview
dans une mise en page de contrainte. Vous trouverez ci-dessous la hiérarchie de la présentation XML. Le problème, c’est qu’il ne fait pas défiler vers le bas, mais uniquement les 10 premières vues. Les 3 derniers champs sont masqués car la vue ne défile plus.
DISPOSITION DES PARENTS
<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>
Cette disposition fonctionne dans mon application . L'astuce consiste à définir ces deux attributs dans ScrollView: Android: layout_height = "0dp" App: layout_constraintBottom_toBottomOf = "parent"
La mise en page simplifiée de mon application:
<?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>
Deux étapes
Conserver la hauteur de la présentation pour la vue de défilement zéroAndroid:layout_height="0dp"
Encore une fois pour la vue de défilementAndroid:fillViewport="true"
Essayez d'ajouter la contrainte de fond à scrollview (par exemple: app:layout_constraintBottom_toBottomOf="parent"
) Et changez Android: layout_height = "wrap_content" en Android:layout_height="0dp"
Dans mon cas, NestedScrollView
a travaillé au lieu de ScrollView
. Voici l'extrait de ma mise en page de travail:
<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>
Il suffit de mettre Android:fillViewport="true"
dans la disposition parente
Vous avez deux solutions à ce problème (la même solution mais de deux manières):
Si vous mettez le Mode Création dans Android Studio, sélectionnez votre onglet Attributs ScrollView et Open et, dans la page layout_height, sélectionnez " match_constraint ".
Si vous utilisez le mode Texte dans Android Studio, utilisez ceci:
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tb_details">
Vérifiez que la hauteur de ScrollView est définie sur 0dp. Ces deux méthodes permettent de résoudre le même problème, mais ce sont les différentes manières de le faire.
ScrollView n'est pas la vue racine, j'ai une mise en page Constraint enveloppant le ScrollView comme vous.
Dans mon cas, j'avais une TextView
haute (hauteur définie à wrap_content
) dans une ScrollView
(hauteur définie à 0dp
et contrainte en haut et en bas). Aucune suggestion n'a fonctionné, mais j'ai résolu le problème en encapsulant la TextView
dans une FrameLayout
(hauteur définie sur wrap_content
).