CardView tidak menampilkan Shadow di Android L


123

Cardview saya di dalam Listview tidak menunjukkan bayangan di Android L (Nexus 5). Juga tepi bundar tidak ditampilkan dengan benar. Berikut adalah kode untuk Tampilan Adaptor Listview:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardCornerRadius="4dp"
    app:cardElevation="4dp" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingTop="@dimen/activity_vertical_margin" >

        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="@dimen/padding_small"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ImageView
            android:id="@+id/ivPicture"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvName"
            android:layout_centerHorizontal="true"
            android:scaleType="fitCenter" />

        <TextView
            android:id="@+id/tvDetail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/ivPicture"
            android:layout_centerHorizontal="true"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin" />
    </RelativeLayout>
</android.support.v7.widget.CardView>

Dan ListView xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/app_bg" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:cacheColorHint="#00000000"
    android:divider="@android:color/transparent"
    android:drawSelectorOnTop="true"
    android:smoothScrollbar="true" />

<ProgressBar
    android:id="@+id/progressBarMain"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone" /></RelativeLayout>

Ini berfungsi dengan baik pada perangkat pra-L dengan bayangan yang tepat dan sudut membulat. Tapi tidak berfungsi pada perangkat Android L. Bisakah Anda memberi tahu apa yang saya lewatkan di sini?



@AIL Tapi saya tidak menggunakan latar belakang transparan untuk cardview atau pandangan induknya
isumit

@isumit Yap, masalah sama disini.
greywolf82

@ greywolf82 jika Anda belum menemukan solusi. Saya menambahkan margin ke cardview dan sekarang menampilkan bayangan di Lollipop
isumit

Jawaban:


279

Setelah melalui dokumen lagi, akhirnya saya menemukan solusinya.

Cukup tambahkan card_view:cardUseCompatPadding="true"ke Anda CardViewdan bayangan akan muncul di perangkat Lollipop.

Yang terjadi adalah, area konten di CardViewambil dengan ukuran berbeda pada perangkat pra-lollipop dan lollipop. Jadi di perangkat lollipop bayangan benar-benar tertutup oleh kartu sehingga tidak terlihat. Dengan menambahkan atribut ini, area konten tetap sama di semua perangkat dan bayangan menjadi terlihat.

Kode xml saya seperti:

<android.support.v7.widget.CardView
    android:id="@+id/media_card_view"
    android:layout_width="match_parent"
    android:layout_height="130dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardElevation="2dp"
    card_view:cardUseCompatPadding="true"
    >
...
</android.support.v7.widget.CardView>

@ alex-lockwood Bisakah Anda jelaskan perubahan Anda yaitu, card_view:cardElevation="2sp"ke card_view:cardElevation="2dp"?
Ram Patra

1
@Ramswaroop spsebaiknya hanya digunakan untuk ukuran teks. dpharus digunakan untuk semua dimensi lainnya.
Alex Lockwood

Saya membutuhkan case card_view: cardUseCompatPadding saya. Selain itu, saya perlu mengubah targetSdkVersion ke 21. Mengubah margin tidak berpengaruh.
Remi

@ KishanSolanki124 Saya pikir OP (@isumit) telah kehilangan jejak ini.
Ram Patra

55

Jangan lupa bahwa untuk menggambar bayangan Anda harus menggunakan hardwareAcceleratedgambar

hardwareAccelerated = true

masukkan deskripsi gambar di sini

hardwareAccelerated = false

hardwareAccelerated CardView

Lihat Akselerasi Perangkat Keras Android untuk detailnya


10
Akselerasi perangkat keras diaktifkan secara default jika level API Target Anda> = 14!
Aksel Fatih

2
Bekerja,. Tapi saya tidak mengerti alasan di balik ini
Deepak Kumar

54

gunakan app:cardUseCompatPadding="true"di dalam cardview Anda. Sebagai contoh

<android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="@dimen/cardviewMarginRight"
        app:cardBackgroundColor="@color/menudetailsbgcolor"
        app:cardCornerRadius="@dimen/cardCornerRadius"
        app:cardUseCompatPadding="true"
        app:elevation="0dp">
    </android.support.v7.widget.CardView>

28

periksa perangkat keras Dipercepat dalam manifes membuatnya benar, membuatnya salah menghapus bayangan, ketika bayangan palsu muncul di pratinjau xml tetapi tidak di telepon.


24

Tambahkan baris ini ke CardView ....

card_view:cardUseCompatPadding="true" //for enable shadow
card_view:cardElevation="9dp" // this for how much shadow you want to show

Tips

Anda dapat menghindari layout_marginTop dan layout_marginBottom karena bayangan itu sendiri membutuhkan ruang untuk naik dan turunnya. Jumlah ruang yang ditentukan oleh seberapa banyak yang akan Anda gunakan dalam card_view: cardElevation = "ndp".

Selamat Coding (:


22

Akhirnya saya bisa mendapatkan bayangan pada perangkat Lollipop dengan menambahkan margin ke tampilan kartu. Berikut adalah tata letak cardview terakhir:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res/com.example.myapp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:layout_marginTop="@dimen/padding_small"
    android:layout_marginBottom="@dimen/padding_small"
    app:cardCornerRadius="4dp"
    app:cardElevation="4dp" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="@dimen/padding_small"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ImageView
        android:id="@+id/ivPicture"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvName"
        android:layout_centerHorizontal="true"
        android:scaleType="fitCenter" />

    <TextView
        android:id="@+id/tvDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ivPicture"
        android:layout_centerHorizontal="true"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin" />
</RelativeLayout>


2
Saya sudah menyetel nilai card_view: cardUseCompatPadding, masih belum bisa mendapatkan shaddows. Apa yang saya lewatkan adalah ini, marginnya. Dan itu benar-benar berhasil. Terima kasih.
Ajith Memana

berapa nilai margin Anda? apakah 8dpcukup?
lihat

13

Cukup tambahkan tag ini:

app:cardElevation="2dp"
app:cardUseCompatPadding="true"

Jadi itu menjadi:

<android.support.v7.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="?colorPrimary"
    app:cardCornerRadius="3dp"
    app:cardElevation="2dp"
    app:cardUseCompatPadding="true"
    app:contentPadding="1dp" />

12

Anda dapat menambahkan baris kode ini untuk bayangan dalam tampilan kartu

card_view:cardElevation="3dp"

Di bawah ini Anda memiliki contoh

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@android:color/white"
    android:foreground="?android:attr/selectableItemBackground"
    card_view:cardElevation="3dp"
    card_view:cardCornerRadius="4dp">

Semoga ini membantu!


terima kasih, kuncinya adalah card_view: cardElevation dan bukan android: cardElevation
Badr

8

Anda dapat mencoba dengan menambahkan baris ini

 card_view:cardUseCompatPadding="true"

Kode Utuh akan terlihat seperti ini

  <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="200dp"
        android:layout_margin="5dp"
        android:orientation="horizontal"
        card_view:cardUseCompatPadding="true"
        card_view:cardCornerRadius="5dp">
 </android.support.v7.widget.CardView

7

Dalam kasus saya, bayangan tidak muncul di perangkat Android L karena saya tidak menambahkan margin. Masalahnya adalah CardView membuat margin ini secara otomatis di <5 perangkat jadi sekarang saya melakukannya seperti ini:

CardView card = new CardView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
if (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT) {
    params.setMargins(shadowSize, shadowSize, shadowSize,
            shadowSize);
} else {
    card.setMaxCardElevation(shadowSize);
}
card.setCardElevation(shadowSize);
card.setLayoutParams(params);

menambahkan margin ke cardview dari file layout berfungsi. Tidak mencoba dari kode
isumit

6

Tambahkan android: hardwareAccelerated = "true" di file manifes Anda seperti di bawah ini

 <activity
        android:name=".activity.MyCardViewActivity"
        android:hardwareAccelerated="true"></activity>

4

Pertama-tama pastikan bahwa dependensi berikut ditambahkan dan dikompilasi dengan benar dalam file build.gradle

    dependencies {
    ...
    compile 'com.android.support:cardview-v7:21.0.+'

    }

dan setelah ini coba kode berikut:

     <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="200dp"
            android:layout_margin="5dp"
            android:orientation="horizontal"
            card_view:cardCornerRadius="5dp">
     </android.support.v7.widget.CardView

Masalah muncul di Android L karena atribut layout_margin tidak ditambahkan


0

Recyclerview saya lambat dalam memuat jadi dengan membaca stackoverflow.com saya mengubah hardwareAccelerated menjadi "false" maka elevasi tidak muncul di perangkat. Saya berubah kembali menjadi true. Ini berhasil untuk saya.


0

Tampilan kartu tidak dapat menampilkan bayangan karena Anda RelativeLayoutberada di bayangan tampilan kartu. Untuk memperlihatkan bayangan tambahkan margin pada tampilan Kartu Anda. Sebagai contoh:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="8dp">

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

</RelativeLayout>

0

Saya pikir jika Anda memeriksa manifes Anda terlebih dahulu jika Anda menulis android:hardwareAccelerated="false" Anda harus membuatnya truememiliki bayangan untuk kartu Seperti jawaban ini di sini


0

Pastikan Anda tidak menggunakan android:layerType="software"di RecyclerView Anda .

Mengubahnya untuk android:layerType="hardware"memecahkan masalah bagi saya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.