Les pages doivent remplir tout le ViewPager2 (utilisez match_parent)

11

J'ai une disposition d'article dans laquelle j'affiche une image, un nom de produit et une image de produit. Je dois afficher l'image en ration 1: 1,5 en utilisant la disposition des contraintes. Mais quand je charge une petite image, les textes ci-dessous ne s'affichent pas.

Ci-dessous mon code d'article XML: -

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/coordinatorLayoutCartRoot"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.jackandphantom.circularimageview.RoundedImage
            android:id="@+id/imageViewSlider"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:layout_constraintBottom_toTopOf="@id/tvTitle"
            app:layout_constraintDimensionRatio="WH,1:1.4"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:rounded_radius="0"
            tools:src="@tools:sample/avatars" />

        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="Fitted crew neck sweater"
            android:textColor="@color/colorBlack"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/imageViewSlider" />

        <TextView
            android:id="@+id/tvPrice"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="$34.00"
            android:textColor="@color/colorBlack"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvTitle" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
  1. Sortie avec image longue: - https://i.imgur.com/QVnljX6.png
  2. Sortie avec petite image: - https://i.imgur.com/0ZwkVwE.png

Et si je remplace match_parent par wrap_content, l'application se bloque avec l'erreur ci-dessous: -

java.lang.IllegalStateException: les pages doivent remplir tout le ViewPager2 (utiliser match_parent)

Mahesh Babariya
la source
Si vous souhaitez modifier la hauteur de la page, modifiez simplement la hauteur des viseurs.
user3783123
@Mahesh J'ai le même problème. Avez-vous trouvé la solution?
androidStud
@androidStud pas encore
Mahesh Babariya
@MaheshBabariya Voir ma réponse ci-dessous.
androidStud
Oui, définissez-le sur match_parent et si vous souhaitez le réduire, essayez de le faire dans la vue ou avec le téléavertisseur de vue lui-même.
Tobias Reich

Réponses:

10

J'ai découvert que le problème est de gonfler le support de vue.

J'ai eu le même problème et l'ai résolu en changeant

ViewBinding.inflate(inflater)

à

ViewBinding.inflate(inflater, parent, false)
Bresiu
la source
1
ce n'est pas la réponse, viewPagger2 a toujours exigé la disposition des éléments pour correspondre à la hauteur et à la largeur du parent. correction de la contrainstlayout.
Indra As Lesmana
5

Tout en luttant contre ce problème, j'ai compris quel était le problème. Mon cas d'utilisation était que j'utilisais androidx.viewpager2.widget.ViewPager2 et appelais des vues normales dans RecyclerView.

Si vous remarquez soigneusement l'erreur, vous verrez quelque chose comme ceci:

 java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)
    at androidx.viewpager2.widget.ViewPager2$2.onChildViewAttachedToWindow(ViewPager2.java:170)

La deuxième ligne est la clé du problème principal. Si vous ouvrez ViewPager2.java, vous verrez

 private RecyclerView.OnChildAttachStateChangeListener enforceChildFillListener() {
    return new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(@NonNull View view) {
            RecyclerView.LayoutParams layoutParams =
                    (RecyclerView.LayoutParams) view.getLayoutParams();
            if (layoutParams.width != LayoutParams.MATCH_PARENT
                    || layoutParams.height != LayoutParams.MATCH_PARENT) {
                throw new IllegalStateException(
                        "Pages must fill the whole ViewPager2 (use match_parent)");
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(@NonNull View view) {
            // nothing
        }
    };
}

Android ne prend pas le match_parent attribué en xml pour joindre des vues. De futures améliorations pourraient être apportées dans la prochaine version de ViewPager2.

Quoi qu'il en soit, pour l'instant, pour résoudre le problème, définissez les paramètres de mise en page comme MATCH_PARENT explicité.

 view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

Cette vue est la vue parent contenant les enfants View Pager.

Dans votre cas, ce serait androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
la source
Résolu en utilisant ce view.setLayoutParams (nouveau LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil
1

Pour moi, le problème était que les pages (c'est-à-dire la disposition parent / racine de l'adaptateur) dans ViewPager2 n'étaient pas match_parent, donc l'erreur était java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Arpit J.
la source
1

j'ai fait face au même problème maintenant, la largeur et la hauteur de votre élément d'adaptateur doivent être match_parent

Amr263
la source
0

J'ai eu le même problème. J'ai utilisé ViewPager2 pour afficher le curseur. Mais son élément XML n'était pas MATCH_PARENT. Après ce changement, le problème a été résolu.

saeedmpt
la source
0

L'élément viewpager2 doit avoir une largeur et une hauteur correspondant à parent. mais SI vous utilisez la liaison de vues, vous devez gonfler la mise en page telle que les fragments:

ViewBinding.inflate(inflater, parent, false)
Ali Zarei
la source
0

J'ai également rencontré le même problème, et la solution consiste à définir la hauteur comme match_parent de la vue de votre article, c'est-à-dire que la disposition utilisée dans la classe d'adaptateur doit avoir la hauteur MATCH_PARENT

Vishakha
la source