Menyetel Ketinggian dalam XML di AppCompat CardView di Android 5.0

95

Dari apa yang saya pahami, di awal tahap pratinjau sepertinya tidak ada cara untuk mengatur elevasi di XML hanya pada CardViews tanpa hack di Java. Sekarang rilis resminya sudah keluar, apakah ada cara untuk melakukan ini dalam XML tanpa menulis kode Java untuk mengatur ketinggian?

Saya telah mencoba card_view:cardElevationuntuk tidak berpengaruh. Saya sempat berpikir ketika saya menggunakan emulator untuk 5.0 semuanya baik-baik saja. Tapi sekarang saya menggunakan versi resmi pada perangkat saya yang sebenarnya, semua perangkat saya CardViewmenghilang

Sebelum Lollipop, ini bekerja dengan baik.

Ini xml lengkap saya

<?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
sumber
Saya telah berada di belakang masalah tetapi belum memiliki jawaban. Saat saya upgrade ke lollipop, entah kenapa margin atau paddingnya hilang sehingga tidak terlihat sudut atau tepi kartu sehingga benar-benar rata.
TheLettuceMaster

Jawaban:

316

Sepertinya ada masalah margin / padding, coba setel atribut cardUseCompatPadding ke true. Misalnya:

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

Penjelasan dari dokumen Android:

CardView menambahkan padding tambahan untuk menggambar bayangan pada platform sebelum L.

Ini dapat menyebabkan Kartu memiliki ukuran yang berbeda antara L dan sebelum L. Jika Anda perlu menyelaraskan CardView dengan Tampilan lain, Anda mungkin memerlukan sumber daya dimensi khusus versi api untuk memperhitungkan perubahan. Sebagai alternatif, Anda bisa menyetel flag cardUseCompatPadding ke true dan CardView akan menambahkan nilai padding yang sama pada platform L dan setelahnya.

Karena menyetel flag cardUseCompatPadding ke true menambahkan celah yang tidak perlu di UI, nilai defaultnya adalah false.

Gaëtan Maisse
sumber
1
card_view: cardUseCompatPadding = "true" mendapatkan elevasi untuk berfungsi tetapi menambahkan banyak padding juga ....
Taylor
1
apa nilai default dari cardElevation?
Pengembang android
13

Jika Anda memiliki baris ini

android:hardwareAccelerated="false"

dalam tag aplikasi manifes, bayangan Anda tidak ditampilkan. coba hapus baris ini

atau gunakan

android:hardwareAccelerated="true"

Ini berhasil untuk saya! Saya harap ini berhasil juga untuk Anda :)

Matin Ashtiani
sumber
ya! itulah masalahnya !! Terima kasih banyak! tetapi bukan karena gambar bitmap yang saya gunakan untuk latar belakang, aplikasi melambat :(
Kaushal28
13

Anda harus menggunakan cardElevationatribut.
Perpustakaan Androidx:

Anda dapat menggunakan yang MaterialCarddisertakan di pustaka Komponen Material resmi :

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

Dan dalam tata letak Anda:

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

Atau CardViewdi paket androidx:

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

Dan dalam tata letak Anda:

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

Pustaka dukungan LAMA :

<android.support.v7.widget.CardView
    app:cardElevation="xxdp" 
    app:cardUseCompatPadding="true"
    ..>
Gabriele Mariotti
sumber
1
Tidak, saya mencoba lagi, dan itu tidak berhasil. Saya menambahkan xml lengkap saya di bagian atas.
TheLettuceMaster
Bekerja untuk saya. Berapa ketinggian default?
SMBiggs
Elevasi Card elevasi istirahat: 2dp Elevasi kartu yang dinaikkan: 8dp Kartu memiliki elevasi default 2dp. Di desktop, kartu dapat memiliki ketinggian istirahat 0dp dan naik 8dp saat mengarahkan kursor. Dari google.com/design/spec/components/…
ZimaXXX
itu sudah usang
Makarand
1
@Makarand True. Perpustakaan desain tidak lagi dipertahankan tetapi saya menjawab pertanyaan ini 5 tahun yang lalu. Bagaimanapun, saya telah memperbarui jawabannya dengan detail andriodx.
Gabriele Mariotti
1

Itu memecahkan saya dengan menambahkan

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

sebagai contoh:

<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">
felhi
sumber
0

saya menambahkan atribut app: cardElevation = "8dp" pada tampilan kartu, jadi akan seperti ini:

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

Semoga bisa membantu

Cara Cevin
sumber