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

6 minutos de lectura

Tengo un diseño de artículo donde muestro una imagen, el nombre del producto y la imagen del producto. Debo mostrar la imagen en una proporción de 1:1,5 utilizando un 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="https://stackoverflow.com/questions/58341487/@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 falla con el siguiente error: –

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

  • Si desea cambiar la altura de la página, simplemente cambie la altura de los visualizadores.

    – usuario3783123

    11 oct 2019 a las 13:12

  • @Mahesh Tengo el mismo problema. ¿Encontraste la solución?

    – AndroidStud

    16 oct 2019 a las 0:21

  • @androidStud todavía no

    – Mahesh Babariya

    16 de octubre de 2019 a las 5:25

  • @MaheshBabariya Vea mi respuesta a continuación.

    – AndroidStud

    17 oct 2019 a las 0:56

  • Sí, configúrelo en match_parent y, si desea reducirlo, intente hacerlo dentro de la vista o con el buscapersonas de la vista.

    – Tobías Reich

    14 de noviembre de 2019 a las 11:27

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

Tuve el mismo problema y lo resolví cambiando

ViewBinding.inflate(inflater)

a

ViewBinding.inflate(inflater, parent, false)

  • esta no es la respuesta, viewPagger2 siempre requería que el diseño del elemento coincidiera con la altura y el ancho de los padres. arreglar contrainstlayout.

    – Indra As Lesmana

    25 de enero de 2020 a las 1:24

  • Esto solucionó el problema para mí. Tal vez sin la referencia adecuada al grupo de vistas principal, la vista no puede coincidir con_parent. Por lo tanto, se interpreta como wrap_content y arroja el error mencionado anteriormente.

    – gato alternativo

    29 oct 2020 a las 17:37

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

Android no está tomando el match_parent asignado en xml para adjuntar vistas. Es posible que se realicen mejoras futuras en la próxima versión de ViewPager2.

De todos modos, por ahora, para solucionarlo, establezca los parámetros de diseño como MATCH_PARENT explícitamente.

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

  • Resuelto usando este view.setLayoutParams(nuevo LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

    – Vishal Kottarathil

    30 de abril de 2020 a las 15:38

  • Para mí, resolví el problema usando la línea anterior para establecer parámetros en onCreateViewHolder del adaptador de buscapersonas View.

    – Ajith MA

    19 de noviembre de 2020 a las 6:59

  • Buena explicación y esta solución tiene sentido. Luché con eso un par de horas y finalmente probé su solución, en mi situación específica (estoy usando ComposeView en viewPager) por alguna razón, composeView no ha ocupado toda la página. Acabo de agregar la línea para ConstraintLayout int La clase ViewHolder y funcionó.

    – Artiom

    14 de junio de 2022 a las 15:09

establezca el ancho y la altura en el elemento de su adaptador de ViewPager2 match_parent

  • Estoy enfrentando el mismo problema. ¿Qué pasa si solo quiero usar el ancho como contenido de ajuste?

    – Atif Abbasi

    3 mayo 2021 a las 10:15

  • configure el elemento del adaptador que coincida con el padre y configure el contenido de ajuste de ancho del visor

    – Raana Yavari

    5 de mayo de 2021 a las 5:48

Avatar de usuario de Nikunj Paradva
Nikunj Paradva

Utilizar match_parent para usted viewholder disposición de ViewPager2

Tengo el mismo error, después de que a veces encontré el problema en ViewPager2elemento del adaptador, lo cambié de wrap_content a match_parenty se solucionó.

<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/iv_banner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/> <!--Change height here to match_parent-->

Deberías escribir así:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view: View = inflater.inflate(R.layout.yourlayout, parent, false)
    view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
    return ViewHolder(view)
}
inner class ViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView) {
}

Avatar de usuario de Arpit J.
Arpit J.

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

Avatar de usuario de Ali Zarei
Ali Zarei

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

ViewBinding.inflate(inflater, parent, false)

¿Ha sido útil esta solución?