Moja karta Cardview w widoku listy nie wyświetla cienia w systemie Android L (Nexus 5). Również okrągłe krawędzie nie są prawidłowo pokazane. Oto kod widoku adaptera 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>
I 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>
Działa dobrze na urządzeniach pre-L z odpowiednim cieniem i zaokrąglonymi rogami. Ale nie działa na urządzeniu z Androidem L. Czy możesz powiedzieć, czego tu brakuje?
Odpowiedzi:
Po ponownym przejrzeniu dokumentacji w końcu znalazłem rozwiązanie.
Po prostu dodaj
card_view:cardUseCompatPadding="true"
do swojego,CardView
a cienie pojawią się na urządzeniach Lollipop.To, co się dzieje, to obszar zawartości w
CardView
przybiera różne rozmiary na urządzeniach typu pre-lollipop i lollipop. Tak więc w urządzeniach typu Lollipop cień jest faktycznie zakryty przez kartę, więc nie jest widoczny. Po dodaniu tego atrybutu obszar zawartości pozostaje taki sam na wszystkich urządzeniach, a cień staje się widoczny.Mój kod xml wygląda następująco:
źródło
card_view:cardElevation="2sp"
celucard_view:cardElevation="2dp"
?sp
należy używać tylko do rozmiarów tekstu.dp
należy stosować dla wszystkich innych wymiarów.Nie zapominaj, że aby narysować cień, musisz użyć
hardwareAccelerated
rysunkuhardwareAccelerated = true
hardwareAccelerated = false
Aby uzyskać szczegółowe informacje, zobacz przyspieszenie sprzętowe Androida
źródło
użyj
app:cardUseCompatPadding="true"
w widoku karty. Na przykładźródło
sprawdź hardwareAccelerated w manifeście spraw, aby to prawda, uczynienie go false usuwa cienie, gdy fałszywy cień pojawia się w podglądzie XML, ale nie w telefonie.
źródło
Dodaj tę linię do CardView ....
Porady
Możesz uniknąć layout_marginTop i layout_marginBottom, ponieważ sam cień zajmuje trochę miejsca w górę iw dół. Ilość miejsca zdefiniowana przez to, ile będziesz używać w card_view: cardElevation = "ndp".
Miłego kodowania (:
źródło
W końcu udało mi się uzyskać cienie na urządzeniu Lollipop, dodając marginesy do widoku karty. Oto ostateczny układ kart:
źródło
8dp
wystarczy?Po prostu dodaj te tagi:
Stało się więc:
źródło
Możesz dodać tę linię kodu dla cienia w widoku karty
Poniżej masz przykład
Mam nadzieję że to pomoże!
źródło
Możesz spróbować, dodając tę linię
Cały kod będzie wyglądał następująco
źródło
W moim przypadku cień nie pokazywał się na urządzeniach z Androidem L, ponieważ nie dodałem marginesu. Problem w tym, że CardView tworzy ten margines automatycznie na <5 urządzeniach, więc teraz robię to tak:
źródło
Dodaj android: hardwareAccelerated = "true" w swoim pliku manifestów, jak poniżej, to działa dla mnie
źródło
Przede wszystkim upewnij się, że poniższe zależności zostały poprawnie dodane i skompilowane w pliku build.gradle
a potem wypróbuj następujący kod:
problem narasta w systemie Android L, ponieważ atrybut layout_margin nie został dodany
źródło
Mój recykling ładował się powoli, więc czytając stackoverflow.com zmieniłem hardwareAccelerated na „false”, wtedy elewacja nie jest wyświetlana w urządzeniu. Zmieniłem się z powrotem na prawdę. Mi to pasuje.
źródło
Widok karty nie może pokazać cienia, ponieważ
RelativeLayout
znajdujesz się w cieniu widoku karty. Aby pokazać cień, dodaj marginesy w widoku karty. Na przykład:źródło
Myślę, że jeśli najpierw sprawdzisz swój manifest, jeśli napisałeś
android:hardwareAccelerated="false"
, powinieneś miećtrue
cień dla karty. Jak ta odpowiedź tutajźródło
Sprawdź, czy nie używasz
android:layerType="software"
w swoim RecyclerView .Zmieniam to, aby
android:layerType="hardware"
rozwiązać problem za mnie.źródło
przenieś swój atrybut „uses-sdk” na górę pliku manifestu, jak na poniższej odpowiedzi https://stackoverflow.com/a/27658827/1394139
źródło