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>
- Salida con imagen larga: – https://i.imgur.com/QVnljX6.png
- 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)
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
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 ViewPager2
elemento del adaptador, lo cambié de wrap_content
a match_parent
y 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) {
}
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)
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)
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