Страницы должны заполнять весь 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)

Махеш Бабария
источник
Если вы хотите изменить высоту страницы, просто измените высоту окна просмотра.
user3783123
@Mahesh У меня такая же проблема. Вы нашли решение?
AndroidStud
@androidStud еще нет
Махеш Бабария
@MaheshBabariya Смотрите мой ответ ниже.
AndroidStud
Да, установите его в match_parent, и если вы хотите уменьшить его, попробуйте сделать это внутри представления или с самим пейджером представления.
Тобиас Райх

Ответы:

10

Я выяснил, что проблема в раздутии держателя.

У меня была та же проблема, и я решил ее изменить

ViewBinding.inflate(inflater)

в

ViewBinding.inflate(inflater, parent, false)
Bresiu
источник
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 explicity.

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

Это родительское представление, содержащее дочерние элементы View Pager.

В вашем случае это будет androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
источник
Решено с помощью этого view.setLayoutParams (новый LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Вишал Коттаратхил
1

Для меня проблема заключалась в том, что страницы (т.е. родительский / корневой макет адаптера) в ViewPager2 не были match_parent, поэтому ошибка была java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Арпит Дж.
источник
1

Я столкнулся с той же проблемой, ширина и высота элемента адаптера должны соответствовать match_parent.

Amr263
источник
0

У меня такая же проблема. Я использовал ViewPager2 для отображения слайдера. Но его XML-элемент не был MATCH_PARENT. После этого изменения проблема была решена.

saeedmpt
источник
0

Элемент viewpager2 должен иметь ширину и высоту match_parent. но если вы используете View Binding, вы должны раздувать макет, такой как фрагменты:

ViewBinding.inflate(inflater, parent, false)
Али Зарей
источник
0

Я также столкнулся с той же проблемой, и решение состоит в том, чтобы установить высоту в качестве match_parent вашего представления элемента, т.е. макет, используемый в классе адаптера, должен иметь высоту как MATCH_PARENT

Vishakha
источник