Ich verwende eine CardView als Element in einer RecyclerView. Dabei erzeugt Android automatisch Ränder zwischen der Kartenansicht und dem Bildschirm sowie zwischen verschiedenen Kartenansichten.
<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" />
Ich habe die Anweisungen im Link befolgt, um sie in mein Projekt zu integrieren: sing-recyclerview-and-cardview-in-Eclipse-adt
Ich hatte zuvor ein lineares Layout für das Listenelement verwendet:
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
Dies funktionierte einwandfrei, ohne irgendwelche Abstände zwischen den Listenelementen. Ich habe jetzt gerade das lineare Layout in der Kartenansicht platziert, was zu zusätzlichen Rändern geführt hat.
Der Grund dafür ist, dass ich diesen Elementen exakte Ränder zuweisen möchte, und alle Ränder, die ich jetzt bereitstelle, werden zu diesen bereits vorhandenen Rändern hinzugerechnet. Ich habe versucht, dem cardView-Element null/negative Abstände/Ränder zuzuweisen, aber nichts davon funktioniert.
Wie auch immer, ich kann diese Ränder entfernen oder auf andere Weise genau wissen, wie viel Rand hinzugefügt wird.
haben Sie überprüft, ob es sich um einen Rand oder eine Polsterung handelt? (Entwickleroptionen/Layoutgrenzen anzeigen)
CardView
fügt Füllungen in Plattformen vor L hinzu, um Schatten zu zeichnen. In L, außer Sie setzen useCompatPadding=true
, es sollte keine Lücke geben.
Das Hinzufügen negativer Ränder (obwohl es hässlich ist) sollte funktionieren. Ist dies nicht der Fall, fügen Sie bitte weiteren Code hinzu, wie Sie diese hinzufügen und wie Sie RecyclerView
einrichten.
Es hat bei mir funktioniert. Verwenden:
card_view:cardElevation="0dp"
card_view:cardMaxElevation="0dp"
Soeben in der Antwort von @yigit beschrieben, fügt CardView einen Standardabstand ein, um den Schatten vor Android L zu zeichnen. Die Abstandsgröße wird im CardView-Dokument beschrieben.
Ich habe herausgefunden, dass der Weg, um dieses Auffüllen zu löschen (auch um Auffüllen für Inhalte hinzuzufügen), darin besteht, die contentPaddingLeft (/ Right/Top/Bottom) -Attribute von CardView zu verwenden.
Wenn Sie den Standardabstand löschen möchten, können Sie den contentPadding-Wert auf minus setzen. Wenn Sie eine Inhaltsauffüllung hinzufügen möchten, setzen Sie die Inhaltsauffüllung auf den gewünschten Wert.
In meinem Fall verwende ich diesen Code, um die Standardauffüllung zu löschen:
card_view:contentPaddingLeft="-3dp"
card_view:contentPaddingRight="-3dp"
card_view:contentPaddingTop="-3dp"
card_view:contentPaddingBottom="-3dp"
Ich habe @Shubhams Antwort versucht, aber in RadialGradient.Java wird eine IllegalStateException mit der Meldung "radius must be> 0" ausgelöst.
Verwenden Sie diese beiden Tags unten:
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
hinzufügen card_view:cardPreventCornerOverlap="false"
zu Ihrem card
Es funktioniert nur, wenn Ihr Bild abgerundete Ecken hat
Nun, es scheint, dass es einen viel einfacheren Weg gibt, ohne die Polsterung und alles zu erraten:
card_view:cardPreventCornerOverlap="false"
oder mit Java:
cardView.setPreventCornerOverlap(false)
Der Kommentar von @ vj9 unter der akzeptierten Frage half mir bei der Berechnung der Offsets. Teilen Sie es hier, weil es jemand anderem helfen könnte:
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);
}
verwenden
Android:adjustViewBounds="true"
in der Ansicht, die Sie in die Kartenansicht einwickeln möchten
Wenn Sie den Eckenradius oder die Höhenunterschiede nicht benötigen, können Sie FrameLayout
für Pre-Lollipop verwenden.
<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>
Ich weiß, es ist spät, aber ich hoffe, es wird jemandem helfen
app:cardPreventCornerOverlap="false"
setze app: cardPreventCornerOverlap auf false, um den Trick zu machen :)