หน้าจะต้องเติมทั้ง ViewPager2 (ใช้ match_parent)


11

ฉันมีเลย์เอาต์รายการที่ฉันแสดงรูปภาพชื่อผลิตภัณฑ์และรูปภาพผลิตภัณฑ์ ฉันต้องแสดงภาพในอัตราส่วน 1: 1.5 โดยใช้รูปแบบข้อ จำกัด แต่เมื่อฉันโหลดภาพขนาดเล็กข้อความด้านล่างไม่แสดง

ด้านล่างนี้คือรหัสรายการ 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. เอาท์พุทที่มีภาพยาว: - https://i.imgur.com/QVnljX6.png
  2. เอาต์พุตด้วยรูปภาพขนาดเล็ก: - https://i.imgur.com/0ZwkVwE.png

และถ้าฉันแทนที่ match_parent ด้วย wrap_content แอปขัดข้องด้วยข้อผิดพลาดด้านล่าง: -

java.lang.IllegalStateException: หน้าจะต้องเติมทั้ง ViewPager2 (ใช้ match_parent)


หากคุณต้องการเปลี่ยนความสูงของหน้าเพียงแค่เปลี่ยนความสูงของวิวเวอร์
3783123

@Mahesh ฉันมีปัญหาเดียวกัน คุณพบทางออกหรือไม่
androidStud


@MaheshBabariya ดูคำตอบของฉันด้านล่าง
androidStud

ใช่ตั้งค่าเป็น match_parent และหากคุณต้องการย่อขนาดให้ลองทำภายในมุมมองหรือด้วยเพจเจอร์มุมมองเอง
Tobias Reich

คำตอบ:


10

ฉันพบว่าปัญหากำลังขยายตัวเพิ่มขึ้น

ฉันมีปัญหาเดียวกันและแก้ไขการเปลี่ยนแปลง

ViewBinding.inflate(inflater)

ถึง

ViewBinding.inflate(inflater, parent, false)

1
นี่ไม่ใช่คำตอบ viewPagger2 ต้องใช้เลย์เอาต์รายการเพื่อจับคู่ความสูงและความกว้างของพาเรนต์เสมอ แก้ไข contrainstlayout
พระอินทร์ในฐานะ Lesmana

5

ในขณะที่ดิ้นรนกับปัญหานี้ฉันก็พบว่าปัญหาคืออะไร กรณีการใช้งานของฉันคือฉันใช้ androidx.viewpager2.widget.ViewPager2 และเรียกใช้ Views ปกติใน RecyclerView

หากคุณสังเกตเห็นข้อผิดพลาดอย่างระมัดระวังคุณจะเห็นสิ่งนี้:

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

บรรทัดที่สองคือกุญแจสำคัญของปัญหาหลัก หากคุณเปิด ViewPager2.java คุณจะเห็น

 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 ไม่ได้ใช้ match_parent ที่กำหนดใน xml เพื่อแนบมุมมอง อาจเป็นการปรับปรุงในอนาคตที่จะเกิดขึ้นใน ViewPager2 รุ่นถัดไป

ยังไงก็ตามตอนนี้เพื่อแก้ไขตั้งเค้าโครง params เป็น MATCH_PARENT ชัดเจน

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

มุมมองนี้เป็นมุมมองพาเรนต์ที่เก็บลูกเพจเจอร์

ในกรณีที่คุณจะเป็น androidx.constraintlayout.widget.ConstraintLayout

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

แก้ไขโดยใช้ view.setLayoutParams นี้ (LinearLayout.LayoutParams ใหม่ (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Vishal Kottarathil

1

สำหรับฉันปัญหาคือเพจ (เช่นโครงร่างหลัก / รากของอะแดปเตอร์) ใน ViewPager2 ไม่ตรงกันดังนั้นจึงเกิดข้อผิดพลาด java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)


1

ฉันประสบปัญหาเดียวกันในตอนนี้ความกว้างและความสูงของรายการอะแดปเตอร์ของคุณจะต้องเป็น match_parent


0

ผมมีปัญหาเดียวกัน. ฉันใช้ ViewPager2 เพื่อแสดงแถบเลื่อน แต่รายการ XML ไม่ใช่ MATCH_PARENT หลังจากการเปลี่ยนแปลงปัญหาได้รับการแก้ไข


0

รายการ viewpager2 ควรมีความกว้างและความสูงของ match_parent แต่ถ้าคุณใช้ View Binding คุณควรขยายเลย์เอาต์เช่นแฟรกเมนต์:

ViewBinding.inflate(inflater, parent, false)

0

ฉันยังประสบปัญหาเดียวกันและวิธีแก้ไขคือตั้งค่าความสูงเป็น match_parent ของมุมมองรายการของคุณเช่นโครงร่างที่ใช้ในคลาสอะแดปเตอร์จะต้องมีความสูงเท่ากับ MATCH_PARENT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.