Seiten müssen den gesamten ViewPager2 füllen (benutze match_parent)

Lesezeit: 5 Minuten

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 mithilfe des Constraint-Layouts anzeigen. Aber wenn ich ein kleines Bild lade, werden unten die Texte nicht angezeigt.

Unten ist mein Code des Artikels 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="https://stackoverflow.com/questions/58341487/@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 folgendem Fehler ab: –

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

  • Wenn Sie die Seitenhöhe ändern möchten, ändern Sie einfach die Höhe des Viewpagers.

    – Benutzer3783123

    11. Oktober 2019 um 13:12 Uhr

  • @ Mahesh Ich habe das gleiche Problem. Hast du die Lösung gefunden?

    – androidStud

    16. Oktober 2019 um 0:21 Uhr

  • @androidStud noch nicht

    – Mahesh Babariya

    16. Oktober 2019 um 5:25 Uhr

  • @MaheshBabariya Siehe meine Antwort unten.

    – androidStud

    17. Oktober 2019 um 0:56 Uhr

  • 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

    14. November 2019 um 11:27 Uhr

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)

  • Dies ist nicht die Antwort, viewPagger2 benötigte immer das Elementlayout, um der Höhe und Breite der Eltern zu entsprechen. Kontraindikationslayout korrigieren.

    – Indra als Lesmana

    25. Januar 2020 um 1:24 Uhr

  • Dies hat das Problem für mich behoben. Möglicherweise kann die Ansicht ohne richtigen Verweis auf die übergeordnete Ansichtsgruppe nicht mit match_parent übereinstimmen. Daher wird es als wrap_content interpretiert und löst den oben genannten Fehler aus.

    – Alt-Kat

    29. Oktober 2020 um 17:37 Uhr

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

Wenn Sie den Fehler sorgfältig beobachten, sehen Sie in etwa 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, würden Sie sehen

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

Wie auch immer, um das Problem zu beheben, setzen Sie die Layout-Parameter vorerst explizit auf MATCH_PARENT.

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

Diese Ansicht ist die übergeordnete Ansicht, die untergeordnete Ansichts-Pager enthält.

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

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

  • Gelöst mit diesem view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

    – Vishal Kottarathil

    30. April 2020 um 15:38 Uhr

  • Für mich habe ich das Problem gelöst, indem ich die obige Zeile verwendet habe, um Parameter in onCreateViewHolder des View-Pager-Adapters festzulegen.

    – Ajith MA

    19. November 2020 um 6:59 Uhr

  • Gute Erklärung und diese Lösung macht Sinn. Ich habe ein paar Stunden damit gekämpft und schließlich Ihre Lösung ausprobiert. In meiner speziellen Situation (ich verwende ComposeView im ViewPager) hat ComposeView aus irgendeinem Grund nicht die gesamte Seite belegt. Ich habe gerade die Zeile für ConstraintLayout int Die ViewHolder-Klasse hinzugefügt und es hat funktioniert.

    – Artiom

    14. Juni 2022 um 15:09 Uhr

Legen Sie Breite und Höhe in Ihrem Adapterelement von ViewPager2 match_parent fest

  • Ich stehe vor demselben Problem. Was ist, wenn ich nur die Breite als Umbruchinhalt verwenden möchte?

    – Atif AbbAsi

    3. Mai 2021 um 10:15 Uhr

  • Stellen Sie Ihr Adapterelement auf Match Parent ein und legen Sie den Wrap-Inhalt für die Viewpager-Breite fest

    – Raana Yavari

    5. Mai 2021 um 5:48 Uhr

Benutzeravatar von Nikunj Paradva
Nikunj Paradva

Verwenden match_parent zu deinem viewholder Layout von ViewPager2

Ich habe den gleichen Fehler, nachdem ich das Problem manchmal in gefunden habe ViewPager2‘s adapter item, ich habe es von geändert wrap_content zu match_parentund es wurde behoben.

<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/iv_banner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/> <!--Change height here to match_parent-->

Du solltest so schreiben:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view: View = inflater.inflate(R.layout.yourlayout, parent, false)
    view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
    return ViewHolder(view)
}
inner class ViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView) {
}

Benutzeravatar von Arpit J
Arpit J.

Für mich war das Problem, dass Seiten (dh Eltern-/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)

Benutzeravatar von Ali Zarei
Ali Zarei

viewpager2-Element sollte match_parent-Breite und -Höhe haben. Wenn Sie jedoch View Binding verwenden, sollten Sie das Layout wie Fragmente aufblasen:

ViewBinding.inflate(inflater, parent, false)

1438620cookie-checkSeiten müssen den gesamten ViewPager2 füllen (benutze match_parent)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy