Android 5.0下 AppCompat CardView 的 XML 升级设置

根据我的理解,在预览阶段的早期,似乎没有办法只在 CardView上设置 XML 的提升,而不使用 Java。既然官方版本已经发布了,那么有没有办法在不编写 Java 代码来设置升级的情况下用 XML 实现这一点呢?

我试过 card_view:cardElevation没有效果。当我使用5.0版本的模拟器时,我认为一切都很好。但是现在我在我的实际设备上使用官方版本,所有的 CardView都消失了

在吃棒棒糖之前,效果很好。

下面是我的完整 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">
100709 次浏览

You have to use the cardElevation attribute.
Androidx libraries:

You can use the MaterialCard included in the official Material Components library:

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

And in your layout:

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

Or the CardView in the androidx packages:

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

And in your layout:

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

OLD support library:

<android.support.v7.widget.CardView
app:cardElevation="xxdp"
app:cardUseCompatPadding="true"
..>

It looks like a margin/padding problem, try to set the cardUseCompatPadding attribute to true. E.g.:

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

Explanation from Android doc :

CardView adds additional padding to draw shadows on platforms before L.

This may cause Cards to have different sizes between L and before L. If you need to align CardView with other Views, you may need api version specific dimension resources to account for the changes. As an alternative, you can set cardUseCompatPadding flag to true and CardView will add the same padding values on platforms L and after.

Since setting cardUseCompatPadding flag to true adds unnecessary gaps in the UI, default value is false.

If you have this line

android:hardwareAccelerated="false"

in manifest application tag your shadows were not displayed. try to remove this line

or use

android:hardwareAccelerated="true"

This worked for me! I hope it works for you too :)

It solved me by adding

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

for example:

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

i am adding an app:cardElevation="8dp" attribute on card view, so it will be like :

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

Hope it will help

set in cardView

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