CardView在Android L中没有显示Shadow

怀抱观古今,寝食展戏谑。这篇文章主要讲述CardView在Android L中没有显示Shadow相关的知识,希望能为你提供帮助。
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>

它适用于具有适当阴影和圆角的pre-L设备。但不能使用Android L设备。你能告诉我这里缺少什么吗?
答案在再次浏览文档后,我终于找到了解决方案。
只需将card_view:cardUseCompatPadding="true"添加到您的CardView中,阴影将出现在Lollipop设备上。
发生的事情是,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>

另一答案在我的情况下,影子没有在Android L设备上显示,因为我没有添加边距。问题是CardView会在< 5台设备上自动创建此边距,所以现在我这样做:
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);

另一答案首先确保在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中的问题上升beacuse layout_margin属性未添加
另一答案在您的清单文件中添加android:hardwareAccelerated =“true”,如下所示,它适用于我
< activity android:name=".activity.MyCardViewActivity" android:hardwareAccelerated="true"> < /activity>

另一答案将您的“uses-sdk”属性移动到清单顶部,如下面的答案https://stackoverflow.com/a/27658827/1394139
另一答案【CardView在Android L中没有显示Shadow】我的recyclerview加载速度很慢,所以通过读取stackoverflow.com我将hardwareAccelerated更改为“false”,然后设备中没有显示高程。我改回了真实。这个对我有用。
另一答案卡片视图无法显示阴影,因为你的RelativeLayout是卡片视图的阴影。要在卡片视图中显示阴影添加边距。例如:
< 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>

另一答案我想如果你先检查你的清单,如果你写了android:hardwareAccelerated="false"你应该让它true有卡的影子像这样的答案here
另一答案不要忘记画阴影你必须使用hardwareAccelerated绘图
hardwareAccelerated = true
CardView在Android L中没有显示Shadow

文章图片

hardwareAccelerated = false
CardView在Android L中没有显示Shadow

文章图片

有关详细信息,请参阅Android Hardware Acceleration
另一答案在你的cardview中使用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>

另一答案检查manifest中的hardwareAccelerated使其成为true,当false影子出现在xml预览但不出现在手机中时,将其删除阴影。
另一答案最后,通过为cardview添加边距,我可以在Lollipop设备上获得阴影。这是最终的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>


另一答案将此行添加到CardView ....
card_view:cardUseCompatPadding="true" //for enable shadow card_view:cardElevation="9dp" // this for how much shadow you want to show

提示
你可以避免使用layout_marginTop和layout_marginBottom,因为阴影本身会占用它的上下空间。数量空间由你在card_view中使用多少来定义:cardElevation =“ndp”。

    推荐阅读