Warum ist zwischen CardViews auf Lollipop kein Leerzeichen?

79

Ich versuche das zu benutzen CardViewund es funktioniert gut unter 5.0, sieht aber auf Lollipop seltsam aus.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<android.support.v7.widget.CardView android:layout_width="match_parent"
    android:layout_height="200dp">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="card1"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView android:layout_width="match_parent"
    android:layout_height="200dp">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="card2"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</android.support.v7.widget.CardView>
</LinearLayout>

Ich stelle die gleiche Frage, wenn ich das verwende. RecyclerViewSollte ich etwas hinzufügen müssen, wenn es auf Lollipop läuft?

cajsaiko
quelle
1
LinearLayoutzwischen den Karten hinzufügen
Andres Cárdenas

Antworten:

205

Stellen Sie dies auf ein CardView:

app:cardUseCompatPadding="true"

Aus der Dokumentation:

Fügen Sie auch in API v21 + eine Auffüllung hinzu, um dieselben Messungen wie in früheren Versionen zu erzielen.

Tomrozb
quelle
1
Ich habe stattdessen den Namespace "App" verwendet. Wird "card_view" noch verwendet?
wsgeorge
1
@wsgeorge, das war aus der Android-Dokumentation, aber ich habe es zu einem freundlicheren App-Namespace bearbeitet.
Tomrozb
sieht besser aus, aber wie entferne ich die Trennlinie?
Keine Nachrichten
@nonews Du kannst es versuchen android:divider="@null".
SREE
29

Verwenden Sie diese beiden Tags unten in Ihrer Kartenansicht:

app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true"
Omar Faroque Anik
quelle
13

Das erste Bild zeigt das erwartete Verhalten der Kartenansicht. Wenn die Karte eine Höhe hat, fällt der Schatten auf die unteren Schichten. Bei den Pre-Lollipop-Geräten erfolgt die Erhöhung durch Hinzufügen einer Polsterung. So haben die Pre-Lollipop-Geräte eine Polsterung um die Kartenansicht.

Vor L fügt CardView seinem Inhalt eine Auffüllung hinzu und zeichnet Schatten in diesen Bereich. Dieser Polsterungsbetrag entspricht maxCardElevation + (1 - cos45) * CornerRadius an den Seiten und MaxCardElevation * 1,5 + (1 - cos45) * CornerRadius oben und unten.

Null Zeiger
quelle
Die Größe der Kartenansicht, die wir im Editor sehen, entspricht also nicht der tatsächlichen Größe, die wir unter Lollipop verwenden können. Es gibt einen Teil davon, der zum Hinzufügen der Polsterung verwendet wird, und bei Lollipop entspricht die Größe im Layout der tatsächlichen Größe scheint, dass eine Polsterung davon besser aussieht , aber wie soll ich tun, um sie zu trennen?
Cajsaiko
Was Sie im Editor gesehen haben, ist das, was Sie in Wirklichkeit bekommen. Um den gleichen Abstand zwischen den Karten in allen Bildschirmen zu haben. Legen Sie den Rand fest, wenn der API-Hebel 21 oder höher ist
Nullzeiger
5
Diese Antwort ist richtig. Wenn Sie die Benutzeroberfläche konsistent machen möchten, ohne separate Ränder für die Werte 21 hinzuzufügen, können Sie außerdem die kompatible Auffüllung auf true setzen, damit dieselbe Auffüllung auch in L hinzugefügt wird. developer.android.com/reference/android/support/v7/widget/…
yigit
@billgates Nach dem Hinzufügen eines Randes sieht die Kartenansicht sowohl auf Lollpop als auch auf Pre-Lollpop gut aus. Vielen Dank für Ihre Antwort!
Cajsaiko
1
Ist es möglich, die Polsterung bei Pre-Lollipop-Geräten zu entfernen?
user2456977
5

Sie müssen app:cardUseCompatPadding="true"zu Ihrem hinzufügen Cardview. Aber nur das Hinzufügen kann zu einem Fehler führen. Um diesen Fehler zu vermeiden, müssen Sie auch xmlns:app="http://schemas.android.com/apk/res-auto"zu Ihrem hinzufügenCardView .

Zum Beispiel,

<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_height="wrap_content"
    android:layout_width="match_parent"
    app:cardUseCompatPadding="true">

    // Other views here

</android.support.v7.widget.CardView>

Einige würden hinzufügen card_view:cardUseCompatPadding="true"undxmlns:card_view="http://schemas.android.com/apk/res-auto" anstelle der oben genannten. Beide Wege sind richtig.

Wenn Sie mehr über App in XML (Android) erfahren möchten , gehen Sie diese Antwort durch :

Obwohl frühere Antworten das Problem lösen, haben sie nicht erklärt, was jedes Attribut tut. Um hilfreicher zu sein, um Suchenden zu antworten,

cardPreventCornerOverlap Das Attribut fügt CardView ab Version 20 eine Auffüllung hinzu, um Überschneidungen zwischen dem Karteninhalt und abgerundeten Ecken zu vermeiden.

cardUseCompatPadding Das Attribut fügt auch in API v21 + eine Auffüllung hinzu, um dieselben Messungen wie in früheren Versionen zu erzielen.

AnV
quelle