web-dev-qa-db-fra.com

Les pages doivent remplir tout le ViewPager2 (utilisez match_parent)

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, ci-dessous les textes 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)

11
Mahesh Babariya

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)
9
Bresiu

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 attentivement 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 le moment, résolvez-le, définissez les paramètres de disposition sur MATCH_PARENT explicitement.

 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));
5
androidStud

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)

1
Arpit J.

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

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

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.

0
saeedmpt

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

0
Amr263