Почему на Lollipop нет места между CardViews?

79

Я пытаюсь использовать, CardViewи он хорошо работает ниже 5.0, но выглядит странно на Lollipop.

введите описание изображения здесь

введите описание изображения здесь

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

У меня возникает тот же вопрос, когда я использую RecyclerView, нужно ли мне что-то добавлять, если он работает на Lollipop?

Cajsaiko
источник
1
сложить LinearLayoutмежду картами
Андрес Карденас

Ответы:

205

Установите это на CardView:

app:cardUseCompatPadding="true"

Из документации:

Добавьте отступ в API v21 +, чтобы иметь те же размеры, что и в предыдущих версиях.

томрозб
источник
1
Вместо этого я использовал пространство имен "app". "Card_view" все еще используется?
wsgeorge
1
@wsgeorge из документации Android, но я отредактировал ее, сделав ее более понятной.
tomrozb
выглядит лучше, но как убрать разделительную линию?
нет новостей
@nonews Можно попробовать android:divider="@null".
SREE
29

Используйте эти два тега ниже внутри вашего cardview:

app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true"
Омар Фарок Аник
источник
13

Первое изображение - это ожидаемое поведение при просмотре карточки. когда карта имеет возвышение, тень падает на нижние слои. В устройствах pre-lollipop возвышение выполняется путем добавления набивки. таким образом, устройства pre-lollipop будут иметь прокладку вокруг вида карты.

Перед L CardView добавляет отступ к своему содержимому и рисует тени в этой области. Эта величина заполнения равна maxCardElevation + (1 - cos45) * cornerRadius по бокам и maxCardElevation * 1.5 + (1 - cos45) * cornerRadius сверху и снизу.

нулевой указатель
источник
поэтому размер cardview, который мы видим в редакторе, не является реальным размером, который мы можем использовать, когда ниже леденец, есть его часть, которая используется для добавления отступов, а на леденце размер в макете такой же, как реальный, это кажется, что набивка выглядит лучше , но как мне их разделить?
cajsaiko
то, что вы видели в редакторе, вы получаете в реальности. Чтобы иметь одинаковый запас между картами на всех экранах. Установите маржу, если рычаг API равен 21 или выше
нулевой указатель
5
Это правильный ответ. В дополнение к этому, если вы хотите сделать пользовательский интерфейс согласованным без добавления отдельных полей для значений-21, вы можете установить для compat padding значение true, чтобы оно добавляло такое же заполнение и в L. developer.android.com/reference/android/support/v7/widget/…
yigit
@billgates после добавления поля cardview хорошо смотрится как на леденцах, так и перед леденцами, спасибо за ваш ответ!
cajsaiko
1
можно ли удалить прокладку на устройствах pre-lollipop?
user2456977
5

Вы должны добавить app:cardUseCompatPadding="true"в свой Cardview. Но простое добавление этого может привести к ошибке. Чтобы избежать этой ошибки, вам также необходимо добавить xmlns:app="http://schemas.android.com/apk/res-auto"в свой 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_height="wrap_content"
    android:layout_width="match_parent"
    app:cardUseCompatPadding="true">

    // Other views here

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

Некоторые добавили бы card_view:cardUseCompatPadding="true"и xmlns:card_view="http://schemas.android.com/apk/res-auto"вместо упомянутых выше. Оба способа верны.

Если вы хотите узнать больше о приложении в XML (Android), просмотрите этот ответ :

Хотя предыдущие ответы решат проблему, они не объяснили, что делает каждый атрибут. Чтобы помочь ищущим ответов,

cardPreventCornerOverlap Атрибут добавляет заполнение в CardView в версии 20 и ранее, чтобы предотвратить пересечение содержимого карты и закругленных углов.

cardUseCompatPadding Атрибут добавляет отступ в API v21 +, чтобы иметь те же измерения, что и в предыдущих версиях.

AnV
источник