CardView non mostra Shadow in Android L


123

Il mio Cardview all'interno di Listview non mostra ombra in Android L (Nexus 5). Anche i bordi arrotondati non vengono visualizzati correttamente. Ecco il codice per la visualizzazione dell'adattatore di 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>

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

Funziona bene su dispositivi pre-L con ombre adeguate e angoli arrotondati. Ma non funziona su un dispositivo Android L. Puoi dire cosa mi manca qui?



@AIL Ma non sto usando nessuno sfondo trasparente per Cardview o nessuna delle sue visualizzazioni genitore
isumit

@isumit Sì, lo stesso problema qui.
greywolf82

@ greywolf82 nel caso in cui non hai ancora trovato una soluzione. Ho aggiunto margine a cardview e ora mostra l'ombra in Lollipop
isumit

Risposte:


279

Dopo aver esaminato di nuovo i documenti, ho finalmente trovato la soluzione.

Basta aggiungere card_view:cardUseCompatPadding="true"al tuo CardViewe le ombre appariranno sui dispositivi Lollipop.

Quello che succede è che l'area del contenuto CardViewassume dimensioni diverse sui dispositivi pre-lollipop e lollipop. Quindi nei dispositivi lecca-lecca l'ombra è effettivamente coperta dalla carta quindi non è visibile. Aggiungendo questo attributo l'area del contenuto rimane la stessa su tutti i dispositivi e l'ombra diventa visibile.

Il mio codice xml è come:

<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 Puoi spiegare il tuo cambiamento, card_view:cardElevation="2sp"ad esempio a card_view:cardElevation="2dp"?
Ram Patra

1
@Ramswaroop spdeve essere utilizzato solo per le dimensioni del testo. dpdovrebbe essere usato per tutte le altre dimensioni.
Alex Lockwood

Il mio caso card_view: cardUseCompatPadding era necessario. Inoltre devo cambiare targetSdkVersion a 21. La modifica del margine non ha alcun effetto.
Remi

@ KishanSolanki124 Penso che l'OP (@isumit) abbia perso traccia di questo thread.
Ram Patra

55

Non dimenticare che per disegnare l'ombra devi usare il hardwareAccelerateddisegno

hardwareAccelerated = true

inserisci qui la descrizione dell'immagine

hardwareAccelerated = false

hardware CardView accelerato

Vedi Accelerazione hardware Android per i dettagli


10
L'accelerazione hardware è abilitata per impostazione predefinita se il tuo livello API di destinazione è> = 14!
Aksel Fatih

2
Sta funzionando,. Ma non capisco la ragione dietro questo
Deepak Kumar

54

utilizzare app:cardUseCompatPadding="true"all'interno del tuo cardview. Per esempio

<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

controlla hardware L'accelerazione nel manifest rendilo vero, rendendolo falso rimuove le ombre, quando l'ombra falsa appare nell'anteprima xml ma non nel telefono.


24

Aggiungi questa riga a CardView ....

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

Suggerimenti

Puoi evitare layout_marginTop e layout_marginBottom poiché l'ombra stessa occupa un po 'di spazio per salire e scendere. La quantità di spazio definita da quanto utilizzerai in card_view: cardElevation = "ndp".

Happy Coding (:


22

Finalmente sono stato in grado di ottenere ombre sul dispositivo Lollipop aggiungendo margine al cardview. Ecco il layout finale della visualizzazione delle carte:

<?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
Avevo già impostato i valori card_view: cardUseCompatPadding, ma non ero ancora in grado di ottenere le ombre. Quello che mi mancava è questo, i margini. E ha funzionato davvero. Grazie.
Ajith Memana

qual è il tuo valore di margine? è 8dpabbastanza?
behelit

13

Aggiungi semplicemente questo tag:

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

Quindi è diventato:

<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

Puoi aggiungere questa riga di codice per l'ombra nella visualizzazione schede

card_view:cardElevation="3dp"

Di seguito hai un esempio

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

Spero che questo ti aiuti!


grazie, la chiave era card_view: cardElevation e non android: cardElevation
Badr

8

Puoi provare aggiungendo questa riga

 card_view:cardUseCompatPadding="true"

L'intero codice apparirà così

  <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

Nel mio caso l'ombra non veniva visualizzata sui dispositivi Android L perché non avevo aggiunto un margine. Il problema è che CardView crea automaticamente questo margine su <5 dispositivi, quindi ora lo faccio in questo modo:

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

l'aggiunta di margini a cardview dal file di layout funziona. Non ho provato dal codice
isumit

6

Aggiungi android: hardwareAccelerated = "true" nel tuo file manifest come di seguito funziona per me

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

4

Prima di tutto assicurati che le seguenti dipendenze siano correttamente aggiunte e compilate nel file build.gradle

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

    }

e dopo questo prova il seguente codice:

     <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

il problema sorge in Android L perché l'attributo layout_margin non viene aggiunto


0

Il mio recyclerview è stato lento nel caricamento, quindi leggendo stackoverflow.com ho cambiato hardwareAccelerated su "false", quindi l'elevazione non viene visualizzata nel dispositivo. Sono tornato vero. Per me funziona.


0

La visualizzazione schede non può mostrare l'ombra perché sei RelativeLayoutnell'ombra della visualizzazione schede. Per mostrare l'ombra, aggiungi margini sulla tua visualizzazione scheda. Per esempio:

<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

Penso che se controlli prima il tuo manifest, se hai scritto android:hardwareAccelerated="false" , dovresti farlo trueavere l'ombra per la carta Come questa risposta qui


0

Verifica di non utilizzare android:layerType="software"in RecyclerView .

Cambiarlo per ha android:layerType="hardware"risolto il problema per me.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.