Настройка высоты в XML в AppCompat CardView на Android 5.0

95

Насколько я понимаю, на ранней стадии предварительного просмотра не было возможности установить повышение в XML только для CardViews без взлома Java. Теперь, когда вышел официальный релиз, есть ли способ сделать это в XML без написания кода Java для установки повышения?

Я пробовал card_view:cardElevationбезрезультатно. Я думал, когда использовал эмуляторы для 5.0, все в порядке. Но теперь, когда я использую официальную версию на своем устройстве, все мои CardViewфайлы исчезли.

Pre Lollipop, он отлично работает.

Вот мой полный xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:id="@+id/cv1"
    card_view:cardElevation="4dp"
    android:layout_margin="6dp"
    card_view:cardCornerRadius="3dp"
    android:layout_height="match_parent">
TheLettuceMaster
источник
Я решил проблему, но пока не могу ответить. Когда я перешел на леденец, каким-то образом пропали поля или отступы, поэтому они не видят углы или края карты, поэтому она полностью плоская.
TheLettuceMaster

Ответы:

316

Похоже, проблема с полями / заполнениями, попробуйте установить для атрибута cardUseCompatPadding значение true. Например:

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="6dp"
    card_view:cardUseCompatPadding="true"
    card_view:cardElevation="4dp"
    card_view:cardCornerRadius="3dp">

Объяснение из Android-документа:

CardView добавляет дополнительные отступы для рисования теней на платформах до L.

Это может привести к тому, что карты будут иметь разные размеры между L и до L. Если вам нужно выровнять CardView с другими представлениями, вам могут потребоваться ресурсы измерения для конкретной версии api для учета изменений. В качестве альтернативы вы можете установить для флага cardUseCompatPadding значение true, и CardView добавит те же значения заполнения на платформах L и более поздних.

Поскольку установка для флага cardUseCompatPadding значения true добавляет ненужные пробелы в пользовательском интерфейсе, значение по умолчанию - false.

Gaëtan Maisse
источник
1
card_view: cardUseCompatPadding = "true" заставил высоту работать, но также добавил кучу
Тейлор
1
какое значение по умолчанию для cardElevation?
разработчик Android
13

Если у вас есть эта строка

android:hardwareAccelerated="false"

в манифесте тега приложения ваши тени не отображались. попробуйте удалить эту строку

или используйте

android:hardwareAccelerated="true"

Это сработало для меня! Надеюсь, у вас тоже получится :)

Матин Аштиани
источник
Да! это была проблема !! Спасибо большое! но не из-за растрового изображения, которое я использовал для фона, приложение замедляется :(
Kaushal28
13

Вы должны использовать cardElevationатрибут.
Библиотеки Androidx:

Вы можете использовать MaterialCardвходящие в официальную библиотеку компонентов материалов :

implementation 'com.google.android.material:material:1.x.x'

И в вашем макете:

    <com.google.android.material.card.MaterialCardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Или CardViewв пакетах androidx:

implementation 'androidx.cardview:cardview:1.x.x'

И в вашем макете:

     <androidx.cardview.widget.CardView
        app:cardElevation="xxdp"
        app:cardUseCompatPadding="true"
        ..>

Старая библиотека поддержки :

<android.support.v7.widget.CardView
    app:cardElevation="xxdp" 
    app:cardUseCompatPadding="true"
    ..>
Габриэле Мариотти
источник
1
Нет, я попробовал еще раз, но ничего не вышло. Я добавил свой полный xml вверху.
TheLettuceMaster
Работает для меня. Какая высота по умолчанию?
SMBiggs
Высота Высота карты покоя: 2dp Высота карты поднята: 8dp Карты имеют высоту по умолчанию 2dp. На рабочем столе карты могут иметь высоту 0dp в состоянии покоя и повышаться до 8dp при наведении курсора. Из google.com/design/spec/components/…
ZimaXXX,
это осуждается
Makarand
1
@Makarand Верно. Библиотека дизайна больше не поддерживается, но я ответил на этот вопрос 5 лет назад. В любом случае я обновил ответ с подробностями о andriodx.
Габриэле Мариотти
1

Это решило меня, добавив

xmlns: card_view = "http://schemas.android.com/apk/res-auto"

например:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    card_view:cardCornerRadius="5dp">
фели
источник
0

Я добавляю атрибут app: cardElevation = "8dp" в представление карты, поэтому он будет примерно таким:

<android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        app:cardElevation="8dp"
        app:cardCornerRadius="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerCrop"
            android:src="@drawable/kmp_warna1" />

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

Надеюсь, это поможет

Cevin Ways
источник