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要素にゼロ/負のパディング/マージンを提供しようとしましたが、これらはいずれも機能しません。
どんなアイデアでも、これらのマージンを削除するか、追加されるマージンの量を正確に知ることができます。
マージンかパディングかを確認しましたか? (開発オプション/レイアウト境界の表示)
CardView
は、影を描画するためにL以前のプラットフォームにパディングを追加します。 Lでは、useCompatPadding=true
を設定しない限り、ギャップはないはずです。
負のマージンを追加すると(いですが)動作するはずです。そうでない場合は、追加方法とRecyclerView
の設定方法に関するコードを追加してください。
それは私のために働いた。つかいます:
card_view:cardElevation="0dp"
card_view:cardMaxElevation="0dp"
@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>>」というメッセージとともにスローされます。
以下の2つのタグを使用します。
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
card_view:cardPreventCornerOverlap="false"
をcard
に追加します。画像に角の丸みがある場合にのみ機能します
まあ、パディングとすべてを推測することなく、それを行うはるかに簡単な方法があるようです:
card_view:cardPreventCornerOverlap="false"
またはJavaを使用:
cardView.setPreventCornerOverlap(false)
受け入れられた質問の下の@ 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);
}
つかいます
Android:adjustViewBounds="true"
カードビューでラップしたいビューで
コーナーの半径や高度を下げる必要がない場合は、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>
私はそれが遅いことを知っていますが、それが誰かを助けることを願っています
app:cardPreventCornerOverlap="false"
app:cardPreventCornerOverlapをfalseに設定すると、トリックが実行されます:)