CardView在Android L中不显示阴影

我在Listview内的Cardview在Android L(Nexus 5)中没有显示阴影。 此外,圆形边缘没有正确显示。 这里是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> 

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

它适用于具有适当阴影和圆angular的前L设备。 但不工作Android L设备。 你能告诉我在这里失踪了吗?

再次通过文档后,我终于find了解决办法。

只需在card_view:cardUseCompatPadding="true"添加card_view:cardUseCompatPadding="true" ,棒棒糖设备上就会出现阴影。

发生的情况是, CardView的内容区域在棒棒糖和棒棒糖设备上的大小不同。 所以在棒棒糖设备中,阴影实际上被卡片覆盖,所以它不可见。 通过添加此属性,所有设备的内容区域保持不变,阴影变得可见。

我的XML代码是这样的:

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

app:cardUseCompatPadding="true"使用app:cardUseCompatPadding="true" 。 例如

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

不要忘记,要画阴影,你必须使用hardwareAccelerated加速绘图

hardwareAccelerated = true 在这里输入图像说明

hardwareAccelerated = false hardwareAccelerated CardView

有关详细信息,请参阅Android硬件加速

最后,我通过在卡片视图中添加边距,可以在棒棒糖设备上获得阴影。 这是最终的cardview布局:

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

检查hardwareAccelerated在清单中使它成真,使它错误删除阴影,当虚假阴影出现在xml预览,但不是在手机。

你可以尝试join这一行

  card_view:cardUseCompatPadding="true" 

整个代码将会像这样

  <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 

您可以在卡片视图中为阴影添加此行代码

 card_view:cardElevation="3dp" 

下面你有一个例子

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

希望这可以帮助!

首先确保以下依赖关系在build.gradle文件中被正确添加和编译

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

并在此之后尝试下面的代码:

  <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的问题上升,因为没有添加layout_margin属性

在我的情况下,影子没有在Android L设备上显示,因为我没有添加保证金。 问题是,CardView自动在<5个设备上创build这个边距,所以现在我这样做:

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

只需添加此标签:

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

所以它成为:

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

在清单顶部移动您的“uses-sdk”属性,如下面的答案https://stackoverflow.com/a/27658827/1394139

我的recyclerview加载速度慢,所以通过阅读stackoverflow.com我改变了硬件加速到“假”,然后海拔没有显示在设备中。 我改回了真实。 这个对我有用。