Сторінки повинні заповнювати весь ViewPager2 (використовувати match_parent)


11

У мене є елемент макета, де я відображаю зображення, назву продукту та зображення продукту. Я повинен відображати зображення у співвідношенні 1: 1,5, використовуючи обмежувальний макет. Але коли я завантажую невелике зображення, внизу тексти не відображаються.

Нижче мій код елемента 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. Вихід з довгим зображенням: - https://i.imgur.com/QVnljX6.png
  2. Вихід із невеликим зображенням: - https://i.imgur.com/0ZwkVwE.png

І якщо я заміню match_parent на wrap_content, програма виходить з ладу нижче помилки: -

java.lang.IllegalStateException: Сторінки повинні заповнювати весь ViewPager2 (використовувати match_parent)


Якщо ви хочете змінити висоту сторінки, просто змініть висоту оглядачів.
користувач3783123

@Mahesh У мене виникає таке ж питання. Ви знайшли рішення?
androidStud

@androidStud ще не
Mahesh Babariya

@MaheshBabariya Дивіться мою відповідь нижче.
androidStud

Так, встановіть його на match_parent і, якщо ви хочете зменшити його, спробуйте зробити це всередині подання або із самим пейджером перегляду.
Тобіас Райх

Відповіді:


10

Я з'ясував, що проблема полягає в надуванні власника подання.

У мене було те саме питання, і я вирішив його змінивши

ViewBinding.inflate(inflater)

до

ViewBinding.inflate(inflater, parent, false)

1
це не відповідь, viewPagger2 завжди вимагав компонування елемента, щоб відповідати висоті та ширині батьків. виправити контрастний простір.
Індра як Лесмана

5

Бореться з цією проблемою, я зрозумів, у чому проблема. Моїм випадком використання було те, що я використовував androidx.viewpager2.widget.ViewPager2 і викликав звичайні перегляди в RecyclerView.

Якщо ви помітили помилку уважно, ви побачите щось подібне:

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

Другий рядок - це головне питання. Якщо ви відкриєте ViewPager2.java, ви побачите

 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 не приймає match_parent, призначений у xml, щоб додавати представлення даних. Можливо, майбутні вдосконалення будуть зроблені в наступному випуску ViewPager2.

У будь-якому випадку, щоб зараз це виправити, встановіть параметри компонування як чіткість MATCH_PARENT.

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

Цей вигляд є батьківським поданням, у якому перебувають діти Перегляд пейджера.

У вашому випадку це буде androidx.constraintlayout.widget.ConstraintLayout.

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

Вирішено за допомогою цього view.setLayoutParams (новий LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Вішал Коттаратіл

1

Для мене проблема полягала в тому, що сторінки (тобто батьківська / коренева компонування адаптера) у ViewPager2 не відповідали_показів, отже, помилка була java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)


1

Я зіткнувся з тією ж проблемою і зараз, ширина та висота вашого адаптера повинні відповідати прозорості


0

У мене була така ж проблема. Я використовував ViewPager2 для відображення слайдера. Але його елемент XML не був MATCH_PARENT. Після цієї зміни проблема була вирішена.


0

Елемент viewpager2 повинен мати ширину та висоту відповідності. але якщо ви використовуєте прив'язку перегляду, вам слід надути макет, такий як фрагменти:

ViewBinding.inflate(inflater, parent, false)

0

Я також зіткнувся з тією ж проблемою, і рішення полягає в тому, щоб встановити висоту як відповідність вигляду вашого елемента, тобто макет, який використовується в класі адаптера, повинен мати висоту як MATCH_PARENT

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.