CardView, Android L'de Gölge göstermiyor


123

Listview içindeki Cardview'um Android L'de (Nexus 5) gölge göstermiyor. Ayrıca yuvarlak kenarlar doğru şekilde gösterilmemiştir. Listview'in Bağdaştırıcı Görünümü kodu:

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

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

Uygun gölgeli ve yuvarlatılmış köşeli L öncesi cihazlarda iyi çalışır. Ancak Android L cihazında çalışmıyor. Burada neyi kaçırdığımı söyleyebilir misin?



@AIL Ancak kart görünümü veya üst görünümlerinden herhangi biri için şeffaf bir arka plan kullanmıyorum
isumit

@isumit Evet, aynı sorun burada.
greywolf82

@ greywolf82, henüz bir çözüm bulamadıysanız. Kart görünümüne kenar boşluğu ekledim ve şimdi Lollipop'ta gölge görüntülüyor
29'da isumit

Yanıtlar:


280

Dokümanları tekrar inceledikten sonra nihayet çözümü buldum.

Sadece eklemek card_view:cardUseCompatPadding="true"için için CardViewLollipop cihazlarda gösterileceğini ve gölgeler.

Olan şu ki, içerik alanı CardViewlolipop öncesi ve lolipop cihazlarında farklı boyutlarda oluyor. Yani lolipop cihazlarında gölge aslında kartla kaplıdır, bu nedenle görünmez. Bu özniteliğin eklenmesi ile içerik alanı tüm cihazlarda aynı kalır ve gölge görünür hale gelir.

Xml kodum şöyle:

<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'un @ sen yani sizin değişikliği açıklamak Lütfen artık card_view:cardElevation="2sp"hiç card_view:cardElevation="2dp"?
Ram Patra

1
@Ramswaroop spyalnızca metin boyutları için kullanılmalıdır. dpdiğer tüm boyutlar için kullanılmalıdır.
Alex Lockwood

Benim durumum card_view: cardUseCompatPadding gerekliydi. Ayrıca targetSdkVersion'ı 21 olarak değiştirmem gerekiyor. Kenar boşluğunu değiştirmenin bir etkisi yok.
Remi

@ KishanSolanki124 Sanırım OP (@isumit) bu iş parçacığının izini kaybetti.
Ram Patra

55

Unutmayın, gölge çizmek için hardwareAcceleratedçizimi kullanmanız gerekir

hardwareAccelerated = true

görüntü açıklamasını buraya girin

hardwareAccelerated = false

donanım Hızlandırılmış CardView

Ayrıntılar için Android Donanım Hızlandırmasına bakın


10
Hedef API seviyeniz> = 14 ise, donanım hızlandırma varsayılan olarak etkindir!
Aksel Fatih

2
İşe yarıyor,. Ama bunun arkasındaki nedeni anlamıyorum
Deepak Kumar

54

app:cardUseCompatPadding="true"kart görünümünüzün içinde kullanın . Örneğin

<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

donanımı kontrol et Manifest'te hızlandırılmış, bunu doğru yapar, yanlış yapmak gölgeleri kaldırır, xml önizlemesinde yanlış gölge göründüğünde ancak telefonda görünmediğinde.


24

Bu satırı CardView'e ekleyin ....

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

İpuçları

Gölgenin kendisi yukarı ve aşağı doğru biraz yer kapladığından layout_marginTop ve layout_marginBottom'dan kaçınabilirsiniz. Card_view: cardElevation = "ndp" içinde ne kadar kullanacağınızla tanımlanan alan miktarı.

Mutlu Kodlama (:


22

Sonunda kart görünümüne kenar boşluğu ekleyerek Lollipop cihazında gölgeler elde etmeyi başardım. İşte son kart görünümü düzeni:

<?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
Card_view: cardUseCompatPadding değerleri zaten ayarlanmıştı, yine de gölgeleri alamadı. Eksik olan şey bu, kenar boşlukları. Ve gerçekten işe yaradı. Teşekkürler.
Ajith Memana

marj değeriniz nedir? olduğunu 8dpyeterince?
behelit

13

Bu etiketleri eklemeniz yeterlidir:

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

Böylece şu hale geldi:

<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

Kart görünümünde gölge için bu kod satırını ekleyebilirsiniz

card_view:cardElevation="3dp"

Aşağıda bir örnek var

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

Bu yardımcı olur umarım!


teşekkür ederim, anahtar card_view: cardElevation idi ve android değil: cardElevation
Badr

8

Bu satırı ekleyerek deneyebilirsiniz

 card_view:cardUseCompatPadding="true"

Bütün kod böyle görünecek

  <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

Benim durumumda gölge Android L cihazlarda görünmüyordu çünkü bir kenar boşluğu eklemedim. Sorun şu ki CardView bu marjı <5 cihazda otomatik olarak oluşturuyor, bu yüzden şimdi bunu şöyle yapıyorum:

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

düzen dosyası çalışmalarından kart görünümüne kenar boşlukları ekleme.
Koddan

6

Aşağıdaki gibi bildirim dosyanıza android: hardwareAccelerated = "true" ekleyin, benim için çalışıyor

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

4

Her şeyden önce aşağıdaki bağımlılıkların düzgün bir şekilde eklendiğinden ve build.gradle dosyasında derlendiğinden emin olun.

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

    }

ve bundan sonra aşağıdaki kodu deneyin:

     <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

Android L'de sorun artıyor çünkü layout_margin özniteliği eklenmemiş


0

Geri dönüştürücümün yüklenmesi yavaştı, bu yüzden stackoverflow.com'u okuyarak hardwareAccelerated'ı "false" olarak değiştirdim, sonra cihazda yükseklik görünmüyor. Ben gerçeğe geri döndüm. Benim için çalışıyor.


0

Kart görünümünüzün gölgesinde RelativeLayoutbulunduğunuz için kart görünümü gölge gösteremez . Gölgeyi göstermek için Kart görünümünüzde kenar boşlukları ekleyin. Örneğin:

<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

Bence önce manifestini kontrol edersen, yazdıysan kartın gölgesine android:hardwareAccelerated="false" geçmelisin trueBu cevap gibi buradaki gibi


0

RecyclerView'ınızda kullanmadığınızdan emin android:layerType="software"olun .

android:layerType="hardware"Benim için sorunu çözecek şekilde değiştirmek .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.