Halaman harus mengisi seluruh ViewPager2 (gunakan match_parent)

11

Saya memiliki tata letak item tempat saya menampilkan gambar, nama produk, dan gambar produk. Saya harus menampilkan gambar dalam rasio 1: 1.5 menggunakan tata letak kendala. Tetapi ketika saya memuat gambar kecil, teks di bawah ini tidak ditampilkan.

Di bawah ini adalah kode item XML saya: -

<?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. Output dengan gambar panjang: - https://i.imgur.com/QVnljX6.png
  2. Output dengan gambar kecil: - https://i.imgur.com/0ZwkVwE.png

Dan jika saya mengganti match_parent dengan wrap_content, aplikasi macet dengan kesalahan di bawah ini: -

java.lang.IllegalStateException: Halaman harus mengisi seluruh ViewPager2 (gunakan match_parent)

Mahesh Babariya
sumber
Jika Anda ingin mengubah tinggi halaman, cukup ubah tinggi viewpagers.
user3783123
@ Mahesh Saya mengalami masalah yang sama. Apakah Anda menemukan solusinya?
androidStud
@androidStud belum
Mahesh Babariya
@MaheshBabariya Lihat tanggapan saya di bawah ini.
androidStud
Ya, atur ke match_parent dan jika Anda ingin mengecilkannya, coba lakukan di dalam tampilan atau dengan pager tampilan itu sendiri.
Tobias Reich

Jawaban:

10

Saya telah menemukan bahwa masalahnya adalah menggembungkan view holder.

Saya memiliki masalah yang sama dan menyelesaikannya dengan mengubah

ViewBinding.inflate(inflater)

untuk

ViewBinding.inflate(inflater, parent, false)
Bresiu
sumber
1
ini bukan jawabannya, viewPagger2 selalu membutuhkan tata letak item agar sesuai dengan tinggi dan lebar induk. perbaiki contrainstlayout.
Indra As Lesmana
5

Sambil berjuang dengan masalah ini, saya mencari tahu apa masalahnya. Kasus penggunaan saya adalah saya menggunakan androidx.viewpager2.widget.ViewPager2, dan memanggil Tampilan normal di RecyclerView.

Jika Anda memperhatikan kesalahan dengan cermat, Anda akan melihat sesuatu seperti ini:

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

Baris kedua adalah kunci untuk masalah utama. Jika Anda membuka ViewPager2.java Anda akan melihat

 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 tidak menggunakan match_parent yang ditugaskan dalam xml untuk melampirkan tampilan. Mungkin perbaikan di masa depan akan dilakukan dalam rilis berikutnya ViewPager2.

Bagaimanapun, untuk sekarang memperbaikinya, setel tata letak params sebagai MATCH_PARENT kejelasan.

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

Tampilan ini adalah tampilan induk yang memegang anak-anak Lihat Pager.

Jika Anda akan androidx.constraintlayout.widget.ConstraintLayout.

 view.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
androidStud
sumber
Diselesaikan menggunakan view.setLayoutParams ini (LinearLayout.LayoutParams baru (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil
1

Bagi saya, masalahnya adalah halaman (yaitu tata letak induk / root adaptor) di ViewPager2 bukan match_parent maka kesalahannya adalah java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

Arpit J.
sumber
1

saya menghadapi masalah yang sama sekarang, lebar dan tinggi item adaptor Anda harus match_parent

Amr263
sumber
0

Saya memiliki masalah yang sama. Saya menggunakan ViewPager2 untuk menampilkan slider. Tetapi item XML-nya bukan MATCH_PARENT. Setelah perubahan itu masalah terselesaikan.

saeedmpt
sumber
0

item viewpager2 harus memiliki lebar dan tinggi match_parent. tetapi JIKA Anda menggunakan View Binding, Anda harus mengembang tata letak seperti fragmen:

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

Saya juga menghadapi masalah yang sama, dan solusinya adalah mengatur ketinggian sebagai match_parent dari tampilan item Anda yaitu tata letak yang digunakan dalam kelas adaptor harus memiliki tinggi seperti MATCH_PARENT

Vishakha
sumber