Seiten müssen den gesamten ViewPager2 ausfüllen (verwenden Sie match_parent).

11

Ich habe ein Artikellayout, in dem ich ein Bild, einen Produktnamen und ein Produktbild anzeige. Ich muss das Bild im Verhältnis 1: 1,5 unter Verwendung des Einschränkungslayouts anzeigen. Aber wenn ich ein kleines Bild lade, werden unten keine Texte angezeigt.

Unten ist mein Code von Artikel 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. Ausgabe mit langem Bild: - https://i.imgur.com/QVnljX6.png
  2. Ausgabe mit kleinem Bild: - https://i.imgur.com/0ZwkVwE.png

Und wenn ich match_parent durch wrap_content ersetze, stürzt die App mit dem folgenden Fehler ab: -

java.lang.IllegalStateException: Seiten müssen den gesamten ViewPager2 ausfüllen (match_parent verwenden)

Mahesh Babariya
quelle
Wenn Sie die Seitenhöhe ändern möchten, ändern Sie einfach die Höhe des Viewpagers.
user3783123
@ Mahesh Ich habe das gleiche Problem. Haben Sie die Lösung gefunden?
androidStud
@androidStud noch nicht
Mahesh Babariya
@ MaheshBabariya Siehe meine Antwort unten.
androidStud
Ja, setzen Sie es auf match_parent und wenn Sie es verkleinern möchten, versuchen Sie es in der Ansicht oder mit dem Ansichtspager selbst.
Tobias Reich

Antworten:

10

Ich habe herausgefunden, dass das Problem beim Aufblasen des Sichthalters liegt.

Ich hatte das gleiche Problem und löste es ändernd

ViewBinding.inflate(inflater)

zu

ViewBinding.inflate(inflater, parent, false)
Bresiu
quelle
1
Dies ist nicht die Antwort. Für viewPagger2 war immer ein Elementlayout erforderlich, das der Höhe und Breite der übergeordneten Elemente entspricht. Contrainstlayout korrigieren.
Indra As Lesmana
5

Während ich mit diesem Problem kämpfte, fand ich heraus, wo das Problem lag. Mein Anwendungsfall war, dass ich androidx.viewpager2.widget.ViewPager2 verwendete und normale Ansichten in RecyclerView aufrief.

Wenn Sie den Fehler sorgfältig bemerken, sehen Sie ungefähr Folgendes:

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

Die zweite Zeile ist der Schlüssel zum Hauptproblem. Wenn Sie ViewPager2.java öffnen, wird dies angezeigt

 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 verwendet die in XML zugewiesene match_parent nicht, um Ansichten anzuhängen. Möglicherweise werden zukünftige Verbesserungen in der nächsten Version von ViewPager2 vorgenommen.

Um dies zu beheben, legen Sie die Layoutparameter zunächst als MATCH_PARENT-Explizität fest.

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

Diese Ansicht ist die übergeordnete Ansicht, in der untergeordnete Ansichtspager gespeichert sind.

In diesem Fall wäre es androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
quelle
Gelöst mit diesem view.setLayoutParams (neues LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil
1

Für mich war das Problem, dass Seiten (dh übergeordnetes / Root-Layout des Adapters) in ViewPager2 nicht match_parent waren, daher war der Fehler java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Arpit J.
quelle
1

Ich hatte jetzt das gleiche Problem. Die Breite und Höhe Ihres Adapterelements muss match_parent sein

Amr263
quelle
0

Ich hatte das gleiche Problem. Ich habe ViewPager2 verwendet, um den Schieberegler anzuzeigen. Das XML-Element war jedoch nicht MATCH_PARENT. Nach dieser Änderung wurde das Problem behoben.

saeedmpt
quelle
0

Das Element viewpager2 sollte die Breite und Höhe von match_parent haben. Wenn Sie jedoch die Ansichtsbindung verwenden, sollten Sie das Layout wie z. B. Fragmente aufblasen:

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

Ich hatte auch das gleiche Problem, und die Lösung besteht darin, die Höhe als match_parent Ihrer Elementansicht festzulegen, dh das in der Adapterklasse verwendete Layout muss die Höhe MATCH_PARENT haben

Vishakha
quelle