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?

isumit
quelle
Überprüfen Sie diese stackoverflow.com/questions/26572048/…
Kiloreux
@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>
Ram Patra
quelle
@ 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

AndreyICE
quelle
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>
ShutterSoul
quelle
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.

JSONParser
quelle
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 (:

Shahriar Nasim Nafi
quelle
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>

isumit
quelle
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" />
Shohan Ahmed Sijan
quelle
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!

Ye Min Htut
quelle
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
Yubaraj Poudel
quelle
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);
Simon
quelle
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>
Yatin Deokar
quelle
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

prat3ik-patel
quelle
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.

Lathesh
quelle
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>
Sudip Sadhukhan
quelle
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

amr ismail
quelle
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.

Ban-Geoengineering
quelle