Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] ConstraintLayout : pb header/footer fixe

Pb pour créer un layout : header fixe-contenu scrollable-footer fixe

Sujet résolu
    4 octobre 2019 à 16:12:46

    Salut,

    J'essaye de créer un layout qui me permette d'avoir un "header" fixe (flat_presentation), un corps scrollant (flat_scrollview_container) et un "footer" fixe (flat_status) grâce à un ConstraintLayout.

    Voici mon code xml (j'ai mis des [...] là où je pense que ça n'est pas indispensable à la compréhension du problème mais si ça l'est, je peux le mettre en entier) :

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TableRow
            android:id="@+id/flat_presentation"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:padding="@dimen/basic_padding"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:background="@color/black"
            android:elevation="10dp"
            android:stretchColumns="*">
    
            [...]
    
        </TableRow>
    
        <ScrollView
            android:id="@+id/flat_scrollview_container"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/flat_presentation"
            app:layout_constraintBottom_toBottomOf="@+id/flat_status">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    
       	[...]
            </LinearLayout>
    
        </ScrollView>
    
        <TableRow
            android:id="@+id/flat_status"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@color/green"
            android:padding="@dimen/basic_padding"
            android:stretchColumns="*"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">
    
    	[...]
    
        </TableRow>
    
    </androidx.constraintlayout.widget.ConstraintLayout>

    NB : tout les éléments à l'intérieur du LinearLayout dans le ScrollView sont en layout_height "wrap_content" ou "une hauteur définie spécifiquement".

    Le problème, c'est que j'obtiens un display assez bancal :
    Dans le cas du mode portrait où tout le contenu du ScrollView ne dépasse pas la taille qui reste de l'écran hors header et footer
    - le header (flat_presentation) est bien comme je veux
    - le scrollview démarre bien en-dessous du header
    - le footer (flat_status) est juste en dessous du scrollview, il ne touche pas le bas de l'écran

    Dans le cas du mode paysage où le contenu du Scrollview dépasse la taille qui devrait rester de l'écran
    - le header (flat_presentation) est bien comme je veux
    - le scrollview a l'air de passer en dessous du header plutôt que de commencer en-dessous, et pareil du côté du footer, il semble qu'il y en ait une partie de cacher en-dessous, inaccessible malgré le scroll
    - le footer (flat_status) n'est visible qu'en partie en bas de l'écran

    Pourtant, j'ai l'impression de placer les contraintes comme il faut.
    Je n'arrive pas à voir où je me trompe.
    Est-ce que vous sauriez m'aiguiller vers la solution ?

    NB : le plus frustrant, c'est que dans l'aperçu Android Studio, ça rend bien ce que je recherche mais pas dans les émulateurs (j'ai pas essayé sur mon portable pour voir, je vais tenter au cas où ça pourrait venir de l'émulateur).

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      5 octobre 2019 à 18:07:08

      Des heures perdues pour un détail bête (une fois l'erreur trouvée, elle semble souvent bête)...

      Comme je contrains mon ScrollView en haut et en bas, il ne faut pas que je mette un wrap_content mais un 0dp en layout_height. 
      Après ça, ça marche beaucoup mieux !

          <ScrollView
              android:id="@+id/flat_scrollview_container"
              android:layout_width="0dp"
              android:layout_height="0dp"
              app:layout_constraintLeft_toLeftOf="parent"
              app:layout_constraintRight_toRightOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/flat_presentation"
              app:layout_constraintBottom_toBottomOf="@+id/flat_status">
      • Partager sur Facebook
      • Partager sur Twitter

      [Android] ConstraintLayout : pb header/footer fixe

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown