CardView zeigt Shadow in Android L nicht an


122

Meine Kartenansicht in Listview zeigt in Android L (Nexus 5) keinen Schatten. Auch die runden Kanten sind nicht richtig dargestellt. Hier ist der Code für die Adapteransicht von 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>

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

Es funktioniert gut auf Pre-L-Geräten mit richtigem Schatten und abgerundeten Ecken. Funktioniert aber nicht auf einem Android L-Gerät. Kannst du sagen, was mir hier fehlt?



@AIL Aber ich verwende keinen transparenten Hintergrund für die Kartenansicht oder eine der übergeordneten Ansichten
isumit

@isumit Ja, das gleiche Problem hier.
greywolf82

@ greywolf82 falls du noch keine lösung gefunden hast. Ich habe der Kartenansicht einen Rand hinzugefügt und sie zeigt jetzt Schatten in Lollipop
isumit

Antworten:


278

Nachdem ich die Dokumente noch einmal durchgesehen hatte, fand ich endlich die Lösung.

Fügen card_view:cardUseCompatPadding="true"Sie einfach Ihre hinzu CardViewund Schatten erscheinen auf Lollipop-Geräten.

Was passiert ist, dass der Inhaltsbereich in einer CardViewGröße auf Pre-Lollipop- und Lollipop-Geräten unterschiedlich groß ist. Bei Lutschergeräten wird der Schatten tatsächlich von der Karte verdeckt, sodass er nicht sichtbar ist. Durch Hinzufügen dieses Attributs bleibt der Inhaltsbereich auf allen Geräten gleich und der Schatten wird sichtbar.

Mein XML-Code lautet wie folgt:

<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 Kannst du bitte deine Änderung erklären, dh card_view:cardElevation="2sp"zu card_view:cardElevation="2dp"?
Ram Patra

1
@ Ramswaroop spsollte nur für Textgrößen verwendet werden. dpsollte für alle anderen Dimensionen verwendet werden.
Alex Lockwood

Ich mein Fall card_view: cardUseCompatPadding wurde benötigt. Zusätzlich muss ich targetSdkVersion auf 21 ändern. Das Ändern der Marge hat keine Auswirkung.
Remi

@ KishanSolanki124 Ich denke, das OP (@isumit) hat den Überblick über diesen Thread verloren.
Ram Patra

55

Vergessen Sie nicht, dass Sie zum Zeichnen von Schatten das hardwareAcceleratedZeichnen verwenden müssen

hardwareAccelerated = true

Geben Sie hier die Bildbeschreibung ein

hardwareAccelerated = false

hardwareAccelerated CardView

Weitere Informationen finden Sie unter Android-Hardwarebeschleunigung


10
Die Hardwarebeschleunigung ist standardmäßig aktiviert, wenn Ihre Ziel-API-Stufe> = 14 ist!
Aksel Fatih

2
Es funktioniert,. Aber ich verstehe den Grund dafür nicht
Deepak Kumar

53

Verwenden Sie app:cardUseCompatPadding="true"in Ihrer Kartenansicht. Beispielsweise

<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

check hardwareAccelerated in manifest macht es wahr, macht es falsch entfernt Schatten, wenn in der XML-Vorschau falscher Schatten erscheint, aber nicht im Telefon.


24

Fügen Sie diese Zeile zu CardView hinzu ....

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

Tipps

Sie können layout_marginTop und layout_marginBottom vermeiden, da der Schatten selbst etwas Platz zum Auf und Ab benötigt. Der Platz, der durch die Verwendung in card_view definiert wird: cardElevation = "ndp".

Happy Coding (:


22

Endlich konnte ich Schatten auf dem Lollipop-Gerät bekommen, indem ich der Kartenansicht einen Rand hinzufügte. Hier ist das endgültige Layout der Kartenansicht:

<?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
Ich hatte bereits die Werte für card_view: cardUseCompatPadding festgelegt und konnte die Shaddows immer noch nicht abrufen. Was mir gefehlt hat ist das, die Ränder. Und es hat wirklich funktioniert. Vielen Dank.
Ajith Memana

Was ist Ihr Margin-Wert? ist 8dpgenug
siehe

13

Fügen Sie einfach diese Tags hinzu:

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

So ist es geworden:

<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

Sie können diese Codezeile für Schatten in der Kartenansicht hinzufügen

card_view:cardElevation="3dp"

Unten haben Sie ein Beispiel

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

Hoffe das hilft!


danke, der Schlüssel war card_view: cardElevation und nicht android: cardElevation
Badr

8

Sie können es versuchen, indem Sie diese Zeile hinzufügen

 card_view:cardUseCompatPadding="true"

Der gesamte Code wird so aussehen

  <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

In meinem Fall wurde der Schatten auf Android L-Geräten nicht angezeigt, da ich keinen Rand hinzugefügt habe. Das Problem ist, dass CardView diesen Rand auf <5 Geräten automatisch erstellt. Jetzt mache ich das so:

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

Das Hinzufügen von Rändern zur Kartenansicht aus der Layoutdatei funktioniert.
Ich

6

Fügen Sie android: hardwareAccelerated = "true" in Ihre Manifest-Datei ein, wie unten, es funktioniert für mich

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

4

Stellen Sie zunächst sicher, dass die folgenden Abhängigkeiten ordnungsgemäß in der Datei build.gradle hinzugefügt und kompiliert werden

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

    }

und danach versuchen Sie den folgenden Code:

     <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

Problem tritt in Android L auf, da das Attribut layout_margin nicht hinzugefügt wurde


0

Mein Recyclerview wurde beim Laden langsam ausgeführt. Beim Lesen von stackoverflow.com habe ich hardwareAccelerated in "false" geändert, dann wird die Höhe im Gerät nicht angezeigt. Das habe ich wieder auf wahr geändert. Für mich geht das.


0

RelativeLayoutDie Kartenansicht kann keinen Schatten anzeigen, da Sie sich im Schatten der Kartenansicht befinden. Um den Schatten anzuzeigen, fügen Sie Ihrer Kartenansicht Ränder hinzu. Beispielsweise:

<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

Ich denke, wenn Sie zuerst Ihr Manifest überprüfen, wenn Sie geschrieben haben android:hardwareAccelerated="false" , sollten Sie truees schaffen, Schatten für die Karte zu haben. Wie diese Antwort hier


0

Überprüfen Sie, ob Sie android:layerType="software"in Ihrem RecyclerView nicht verwenden .

Ändern Sie es, um android:layerType="hardware"das Problem für mich zu lösen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.