As páginas devem preencher o ViewPager2 inteiro (use match_parent)

11

Eu tenho um layout de item em que exibo uma imagem, nome do produto e imagem do produto. Devo exibir a imagem na proporção 1: 1.5 usando o layout de restrição. Mas quando carrego uma imagem pequena, os textos abaixo não são exibidos.

Abaixo está o meu código do item 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. Saída com imagem longa: - https://i.imgur.com/QVnljX6.png
  2. Saída com imagem pequena: - https://i.imgur.com/0ZwkVwE.png

E se eu substituir match_parent por wrap_content, o aplicativo trava com o erro abaixo: -

java.lang.IllegalStateException: as páginas devem preencher todo o ViewPager2 (use match_parent)

Mahesh Babariya
fonte
Se você deseja alterar a altura da página, basta alterar a altura dos visitantes.
user3783123
@ Mahesh Estou tendo o mesmo problema. Você encontrou a solução?
procurando
@androidStud ainda não
Mahesh Babariya
@MaheshBabariya Veja minha resposta abaixo.
androidStud
Sim, defina-o como match_parent e, se desejar reduzi-lo, tente fazê-lo dentro da visualização ou com o próprio pager da visualização.
Tobias Reich

Respostas:

10

Descobri que o problema está em inflar o suporte da vista.

Eu tive o mesmo problema e resolvi mudar

ViewBinding.inflate(inflater)

para

ViewBinding.inflate(inflater, parent, false)
Bresiu
fonte
11
essa não é a resposta, o viewPagger2 sempre exigia o layout do item para corresponder à altura e largura dos pais. corrigir contrainstlayout.
Indra As Lesmana 25/01
5

Enquanto lutava com esse problema, descobri qual era o problema. Meu caso de uso foi que eu estava usando androidx.viewpager2.widget.ViewPager2 e chamando Views normais no RecyclerView.

Se você notar o erro com cuidado, verá algo assim:

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

Segunda linha é a chave para a questão principal. Se você abrir o ViewPager2.java, verá

 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
        }
    };
}

O Android não está usando o match_parent atribuído no xml para anexar visualizações. Pode haver melhorias futuras na próxima versão do ViewPager2.

De qualquer forma, por enquanto, para corrigi-lo, defina os parâmetros de layout como explicitamente MATCH_PARENT.

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

Essa visualização é a visualização pai que contém os filhos Visualizar Pager.

No seu caso, seria androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
fonte
Resolvido usando este view.setLayoutParams (novo LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil
1

Para mim, o problema eram as páginas (ou seja, o layout pai / raiz do adaptador) no ViewPager2 não eram match_parent, portanto, o erro foi java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Arpit J.
fonte
1

enfrentei o mesmo problema agora, a largura e a altura do item do adaptador devem ser match_parent

Amr263
fonte
0

Eu tive o mesmo problema. Eu usei o ViewPager2 para exibir o controle deslizante. Mas o item XML não era MATCH_PARENT. Após essa alteração, o problema foi resolvido.

saeedmpt
fonte
0

O item viewpager2 deve ter largura e altura de match_parent. mas, se você estiver usando o View Binding, deve aumentar o layout, como fragmentos:

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

Também enfrentei o mesmo problema, e a solução é definir a altura como match_parent da visualização do item, ou seja, o layout usado na classe do adaptador deve ter altura como MATCH_PARENT

Vishakha
fonte