画像、商品名、商品画像を表示するアイテムレイアウトがあります。制約レイアウトを使用して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>
そして、match_parentをwrap_contentに置き換えると、以下のエラーでアプリがクラッシュします:-
Java.lang.IllegalStateException:ページはViewPager2全体を埋める必要があります(match_parentを使用)
問題は、ビューホルダーの膨張にあることがわかりました。
同じ問題があり、変更して解決しました
ViewBinding.inflate(inflater)
に
ViewBinding.inflate(inflater, parent, false)
この問題に苦しんでいる間、私は問題が何であるかを理解しました。私の使用例は、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));
私にとって、問題はViewPager2のページ(つまり、アダプターの親/ルートレイアウト)がmatch_parentでなかったため、エラーはJava.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)
でした
viewpager2アイテムには、match_parentの幅と高さが必要です。ただし、ビューバインディングを使用している場合は、フラグメントなどのレイアウトを拡張する必要があります。
ViewBinding.inflate(inflater, parent, false)
私も同じ問題を抱えていました。 ViewPager2を使用してスライダーを表示しました。しかし、そのXMLアイテムはMATCH_PARENTではありませんでした。その変更後、問題は解決されました。
私は今同じ問題に直面しました、あなたのアダプターアイテムの幅と高さはmatch_parentでなければなりません