web-dev-qa-db-ja.com

RecyclerView内のCardViewには余分なマージンがあります

CardViewをRecyclerView内の要素として使用しています。その際、AndroidはcardViewと画面間、異なるcardView間にマージンを自動的に生成します。

<Android.support.v7.widget.CardView 
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/galleryCardBGColor"
app:cardCornerRadius="2dp" >

<Android.support.v7.widget.RecyclerView
    Android:id="@+id/my_recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:scrollbars="vertical" />

リンクの指示に従ってプロジェクトに統合しました: sing-recyclerview-and-cardview-in-Eclipse-adt

以前はリスト要素にlinearlayoutを使用していました。

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical" >

これは完全に問題なく機能し、リスト要素間にマージンはまったくありませんでした。 cardView内に線形レイアウトを配置したところ、余白が増えました。

これらの要素に正確なマージンを提供したいという理由と、現在提供しているマージンはこの既存のマージンに追加されています。 cardView要素にゼロ/負のパディング/マージンを提供しようとしましたが、これらはいずれも機能しません。

どんなアイデアでも、これらのマージンを削除するか、追加されるマージンの量を正確に知ることができます。

32
vj9

マージンかパディングかを確認しましたか? (開発オプション/レイアウト境界の表示)

CardViewは、影を描画するためにL以前のプラットフォームにパディングを追加します。 Lでは、useCompatPadding=trueを設定しない限り、ギャップはないはずです。

負のマージンを追加すると(いですが)動作するはずです。そうでない場合は、追加方法とRecyclerViewの設定方法に関するコードを追加してください。

41
yigit

それは私のために働いた。つかいます:

 card_view:cardElevation="0dp"
 card_view:cardMaxElevation="0dp"
44
Shubham

@yigitの回答で説明したように、CardViewはデフォルトのパディングを追加して、Android Lの前に影を描画します。パディングのサイズについては、CardViewのドキュメントで説明しています。

このパディングをクリアする(コンテンツのパディングを追加する)方法は、CardViewのcontentPaddingLeft(/ Right/Top/Bottom)属性を使用することです。

デフォルトのパディングをクリアする場合は、contentPaddingをマイナス値に設定できます。コンテンツパディングを追加する場合は、contentPaddingを目的の値に設定します。

私の場合、これらのコードを使用してデフォルトのパディングをクリアします。

card_view:contentPaddingLeft="-3dp"
card_view:contentPaddingRight="-3dp"
card_view:contentPaddingTop="-3dp"
card_view:contentPaddingBottom="-3dp"

@Shubhamの答えを試しましたが、IllegalStateExceptionがRadialGradient.Javaで「radius must>>」というメッセージとともにスローされます。

18
Piasy

以下の2つのタグを使用します。

card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
14

card_view:cardPreventCornerOverlap="false"cardに追加します。画像に角の丸みがある場合にのみ機能します

4
Shayan_Aryan

まあ、パディングとすべてを推測することなく、それを行うはるかに簡単な方法があるようです:

card_view:cardPreventCornerOverlap="false"

またはJavaを使用:

cardView.setPreventCornerOverlap(false)
2
Ani kukadiya

受け入れられた質問の下の@ vj9からのコメントは、オフセットを計算するのに役立ちました。他の人に役立つ可能性があるため、ここで共有します。

public static int getVerticalCardViewOffset(Context context) {
    Resources res = context.getResources();
    int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
    int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
    return (int) (elevation * 1.5 + (1 - Math.cos(45)) * radius);
}

public static int getHorizontalCardViewOffset(Context context) {
    Resources res = context.getResources();
    int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
    int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
    return (int) (elevation + (1 - Math.cos(45)) * radius);
} 
1
Markus Rubey

つかいます

Android:adjustViewBounds="true"

カードビューでラップしたいビューで

0

コーナーの半径や高度を下げる必要がない場合は、Lollipop以前のFrameLayoutの使用を検討してください。

<include layout="@layout/card_view_compat" />

layout/card_view_compat

<merge
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    >
    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        >
        <include layout="@layout/content" />
    </FrameLayout>
</merge>

layout-v21/card_view_compat

<merge
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    >
    <Android.support.v7.widget.CardView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:cardCornerRadius="3dp"
        app:cardElevation="4dp"
        >
        <include layout="@layout/content" />
    </Android.support.v7.widget.CardView>
</merge>
0
owjsub

私はそれが遅いことを知っていますが、それが誰かを助けることを願っています

app:cardPreventCornerOverlap="false"

app:cardPreventCornerOverlapをfalseに設定すると、トリックが実行されます:)

0
Zubair Rehman