Strony muszą wypełnić cały ViewPager2 (użyj match_parent)


11

Mam układ produktu, w którym wyświetlam obraz, nazwę produktu i obraz produktu. Muszę wyświetlać obraz w proporcji 1: 1,5 przy użyciu układu ograniczeń. Ale kiedy ładuję mały obrazek, poniżej tekstów się nie wyświetla.

Poniżej znajduje się mój kod pozycji 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. Dane wyjściowe z długim obrazem: - https://i.imgur.com/QVnljX6.png
  2. Wyjście z małym obrazem: - https://i.imgur.com/0ZwkVwE.png

A jeśli zamienię match_parent na wrap_content, aplikacja zawiesza się z poniższym błędem: -

java.lang.IllegalStateException: Strony muszą wypełnić cały ViewPager2 (użyj match_parent)


Jeśli chcesz zmienić wysokość strony, po prostu zmień wysokość przeglądarki.
user3783123,

@Mahesh Mam ten sam problem. Znalazłeś rozwiązanie?
androidStud

@ androidStud jeszcze nie
Mahesh Babariya

@MaheshBabariya Zobacz moją odpowiedź poniżej.
androidStud

Tak, ustaw go na match_parent, a jeśli chcesz go zmniejszyć, spróbuj zrobić to w widoku lub z samym pageriem widoku.
Tobias Reich

Odpowiedzi:


10

Dowiedziałem się, że problemem jest napompowanie uchwytu widoku.

Miałem ten sam problem i rozwiązałem go zmieniając

ViewBinding.inflate(inflater)

do

ViewBinding.inflate(inflater, parent, false)

1
to nie jest odpowiedź, viewPagger2 zawsze wymagał układu elementu, aby dopasować wysokość i szerokość rodzica. napraw grę konturową.
Indra As Lesmana

5

Walcząc z tym problemem, zorientowałem się, na czym polega problem. Mój przypadek użycia polegał na tym, że korzystałem z androidx.viewpager2.widget.ViewPager2 i wywoływałem normalne widoki w RecyclerView.

Jeśli zauważysz błąd ostrożnie, zobaczysz coś takiego:

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

Druga linia jest kluczem do głównego problemu. Jeśli otworzysz ViewPager2.java, zobaczysz

 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 nie pobiera elementu match_parent przypisanego w pliku XML do dołączania widoków. Być może przyszłe ulepszenia zostaną wprowadzone w następnej wersji ViewPager2.

W każdym razie, na razie, aby to naprawić, ustaw parametry układu jako objaśnienie MATCH_PARENT.

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

Ten widok jest widokiem nadrzędnym zawierającym Wyświetl potomka Pager.

W twoim przypadku będzie to androidx.constraintlayout.widget.ConstraintLayout.

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

Rozwiązany przy użyciu tego view.setLayoutParams (nowy LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil

1

Dla mnie problem polegał na tym, że strony (tj. Układ nadrzędny / główny adaptera) w ViewPager2 nie były match_parent, dlatego błąd był java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)


1

napotkałem ten sam problem, szerokość i wysokość elementu adaptera musi być zgodna z rodzicem


0

Miałem ten sam problem. Użyłem ViewPager2, aby wyświetlić suwak. Ale jego element XML nie był MATCH_PARENT. Po tej zmianie problem został rozwiązany.


0

element viewpager2 powinien mieć szerokość i wysokość match_parent. ale JEŻELI korzystasz z funkcji Powiązanie widoku, powinieneś napompować układ, taki jak fragmenty:

ViewBinding.inflate(inflater, parent, false)

0

Wystąpił również ten sam problem, a rozwiązaniem jest ustawienie wysokości jako match_parent widoku elementu, tzn. Układ użyty w klasie adaptera musi mieć wysokość jako MATCH_PARENT

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.