Las páginas deben llenar todo el ViewPager2 (use match_parent)

11

Tengo un diseño de elemento donde visualizo una imagen, el nombre del producto y la imagen del producto. Debo mostrar la imagen en una relación 1: 1.5 usando el diseño de restricción. Pero cuando cargo una imagen pequeña, debajo de los textos no se muestran.

A continuación se muestra mi código de elemento 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. Salida con imagen larga: - https://i.imgur.com/QVnljX6.png
  2. Salida con imagen pequeña: - https://i.imgur.com/0ZwkVwE.png

Y si reemplazo match_parent con wrap_content, la aplicación se bloquea con el siguiente error: -

java.lang.IllegalStateException: las páginas deben llenar todo ViewPager2 (use match_parent)

Mahesh Babariya
fuente
Si desea cambiar la altura de la página, simplemente cambie la altura de los visores.
user3783123
@Mahesh Estoy teniendo el mismo problema. ¿Encontraste la solución?
androidStud
@androidStud todavía no
Mahesh Babariya
@MaheshBabariya Vea mi respuesta a continuación.
androidStud
Sí, configúrelo en match_parent y, si desea reducirlo, intente hacerlo dentro de la vista o con el propio buscapersonas.
Tobias Reich

Respuestas:

10

Descubrí que el problema está en inflar el soporte de la vista.

Tuve el mismo problema y lo resolví cambiando

ViewBinding.inflate(inflater)

a

ViewBinding.inflate(inflater, parent, false)
Bresiu
fuente
1
esta no es la respuesta, viewPagger2 siempre requería que el diseño del elemento coincidiera con el alto y el ancho primarios. arreglar contrainstlayout.
Indra como Lesmana
5

Mientras luchaba con este problema, descubrí cuál era el problema. Mi caso de uso fue que estaba usando androidx.viewpager2.widget.ViewPager2, y llamando a Vistas normales en RecyclerView.

Si observa el error con cuidado, verá algo como esto:

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

La segunda línea es la clave del problema principal. Si abres ViewPager2.java verías

 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 no está tomando el match_parent asignado en xml para adjuntar vistas. Puede haber mejoras futuras en la próxima versión de ViewPager2.

De todos modos, por ahora para solucionarlo, configure los parámetros de diseño como explicidad MATCH_PARENT.

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

Esta vista es la vista principal que contiene los hijos de View Pager.

En su caso, sería androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
fuente
Resuelto usando este view.setLayoutParams (nuevo LinearLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil
1

Para mí, el problema era que las páginas (es decir, el diseño principal / raíz del adaptador) en ViewPager2 no eran pareados_por lo tanto, el error era java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Arpit J.
fuente
1

Me enfrenté al mismo problema ahora, el ancho y la altura del elemento del adaptador deben ser match_parent

Amr263
fuente
0

Yo tuve el mismo problema. Usé ViewPager2 para mostrar el control deslizante. Pero su elemento XML no era MATCH_PARENT. Después de ese cambio, el problema se resolvió.

saeedmpt
fuente
0

El elemento viewpager2 debe tener match_parent ancho y alto. pero SI está utilizando Enlace de vista, debe inflar el diseño, como fragmentos:

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

También enfrenté el mismo problema, y ​​la solución es establecer la altura como match_parent de la vista de su elemento, es decir, el diseño utilizado en la clase de adaptador debe tener una altura como MATCH_PARENT

Vishakha
fuente