ページは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を使用)


ページの高さを変更したい場合は、viewpagersの高さを変更してください。
user3783123

@Mahesh私は同じ問題を抱えています。解決策は見つかりましたか?
androidStud

@androidStud未定
Mahesh Babariya、

@MaheshBabariya以下の私の応答を参照してください。
androidStud

ええ、match_parentに設定します。縮小したい場合は、ビュー内またはビューページャー自体で実行してみてください。
トビアスライヒ

回答:


10

問題は、ビューホルダーの膨張にあることがわかりました。

同じ問題があり、変更して解決しました

ViewBinding.inflate(inflater)

ViewBinding.inflate(inflater, parent, false)

1
これは答えではありません。viewPagger2は常に親の高さと幅に一致するアイテムレイアウトを必要としました。contrainstlayoutを修正しました。
インドラAs Lesmana

5

この問題に苦しんでいる間、私は問題が何であるかを理解しました。私の使用例は、androidx.viewpager2.widget.ViewPager2を使用していて、RecyclerViewで通常のビューを呼び出していました。

エラーに注意深く気づくと、次のようなものが表示されます。

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

2行目は主要な問題の鍵です。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は、xmlで割り当てられたmatch_parentを使用してビューをアタッチしていません。ViewPager2の次のリリースで将来の改善が行われる可能性があります。

とにかく、今のところそれを修正するために、レイアウトパラメータを明示的にMATCH_PARENTとして設定します。

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

このビューは、View Pagerの子を保持する親ビューです。

あなたの場合、それはandroidx.constraintlayout.widget.ConstraintLayoutです。

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

このview.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT、ViewGroup.LayoutParams.MATCH_PARENT));を使用して解決されました。
Vishal Kottarathil

1

私にとって、問題はViewPager2のページ(つまり、アダプターの親/ルートレイアウト)がmatch_parentでなかったため、エラーが発生しました java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)


1

私は今同じ問題に直面しました、あなたのアダプターアイテムの幅と高さはmatch_parentでなければなりません


0

私も同じ問題を抱えていました。ViewPager2を使用してスライダーを表示しました。しかし、そのXMLアイテムはMATCH_PARENTではありませんでした。その変更後、問題は解決されました。


0

viewpager2アイテムには、match_parentの幅と高さが必要です。ただし、ビューバインディングを使用している場合は、フラグメントなどのレイアウトを拡張する必要があります。

ViewBinding.inflate(inflater, parent, false)

0

私も同じ問題に直面し、解決策は高さを項目ビューのmatch_parentとして設定することです。つまり、アダプタークラスで使用されるレイアウトはMATCH_PARENTの高さでなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.