Dlaczego między CardViews w Lollipop nie ma spacji?

79

Próbuję używać CardViewi działa dobrze poniżej 5,0, ale wygląda dziwnie na Lollipopie.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

<?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>

Spotykam się z tym samym pytaniem, kiedy używam RecyclerView, czy powinienem coś dodać, jeśli działa na Lollipopie?

cajsaiko
źródło
1
dodać LinearLayoutmiędzy kartami
Andres Cárdenas

Odpowiedzi:

205

Ustaw to na CardView:

app:cardUseCompatPadding="true"

Z dokumentacji:

Dodaj wypełnienie również w API v21 +, aby mieć takie same pomiary jak w poprzednich wersjach.

tomrozb
źródło
1
Zamiast tego użyłem przestrzeni nazw „app”. Czy „card_view” jest nadal używany?
wsgeorge
1
@wsgeorge, który pochodzi z dokumentacji Androida, ale zmodyfikowałem go w bardziej przyjazną przestrzeń nazw aplikacji.
tomrozb
wygląda lepiej, ale jak usunąć linię podziału?
brak wiadomości
@nonews Możesz spróbować android:divider="@null".
SREE
29

Użyj poniższych dwóch tagów w widoku karty:

app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true"
Omar Faroque Anik
źródło
13

pierwszy obraz przedstawia oczekiwane zachowanie widoku karty. gdy karta ma wzniesienie, cień pada na dolne warstwy. W urządzeniach typu pre-lollipop elewacja jest wykonywana przez dodanie wyściółki. więc urządzenia sprzed wersji Lollipop będą miały dopełnienie wokół widoku karty.

Przed L CardView dodaje dopełnienie do swojej zawartości i rysuje cienie do tego obszaru. Ta wartość wypełnienia jest równa wartości maxCardElevation + (1 - cos45) * cornerRadius po bokach i maxCardElevation * 1,5 + (1 - cos45) * cornerRadius na górze i na dole.

pusty wskaźnik
źródło
więc rozmiar widoku karty, który widzimy w edytorze, nie jest rzeczywistym rozmiarem, którego możemy użyć, gdy pod Lollipopem znajduje się jego część, która służy do dodania wypełnienia, a na Lollipopie rozmiar w układzie jest taki sam jak w rzeczywistości, to wygląda na to, że nadanie wypełnienia wygląda lepiej , ale jak mam je rozdzielić?
cajsaiko
to, co widziałeś w edytorze, jest tym, co dostajesz w rzeczywistości. Aby mieć taki sam margines między kartami na wszystkich ekranach. Ustaw margines, jeśli dźwignia API wynosi 21 lub więcej
wskaźnik zerowy
5
Ta odpowiedź jest poprawna. Oprócz tego, jeśli chcesz, aby interfejs użytkownika był spójny bez dodawania oddzielnych marginesów dla wartości -21, możesz ustawić dopełnienie kompatybilności na true, aby dodało to samo wypełnienie również w L. developer.android.com/reference/android/support/v7/widget/…
yigit
@billgates po dodaniu marginesu widok karty wygląda dobrze zarówno na lollpopie, jak i przed lollpopem, dziękuję za odpowiedź!
cajsaiko
1
czy można usunąć wyściółkę w urządzeniach typu pre-lollipop?
user2456977
5

Musisz dodać app:cardUseCompatPadding="true"do swojego Cardview. Ale samo dodanie tego może spowodować błąd. Aby uniknąć tego błędu, musisz również dodać xmlns:app="http://schemas.android.com/apk/res-auto"do swojego CardView.

Na przykład,

<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>

Niektórzy dodaliby card_view:cardUseCompatPadding="true"i xmlns:card_view="http://schemas.android.com/apk/res-auto"zamiast tych wymienionych powyżej. Oba sposoby są poprawne.

Jeśli chcesz dowiedzieć się więcej o aplikacji w formacie XML (Android), skorzystaj z tej odpowiedzi :

Chociaż poprzednie odpowiedzi rozwiążą problem, nie wyjaśniły, co robi każdy atrybut. Aby być bardziej pomocnym w szukaniu odpowiedzi,

cardPreventCornerOverlap atrybut dodaje dopełnienie do CardView w wersji 20 i wcześniej, aby zapobiec przecięciom między zawartością karty i zaokrąglonymi narożnikami.

cardUseCompatPadding atrybut dodaje dopełnienie w API v21 +, aby mieć takie same wymiary jak w poprzednich wersjach.

AnV
źródło