如何在Android L中为CardView小部件设置填充

我正在使用android:paddingLeftandroid:paddingTop为新的CardView小部件设置填充,但不起作用。

我可以为CardView中的所有控件设置边距作为解决方法,但如果控件太多,则会很痛苦。

如何设置新的cardview小部件的填充?

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="200dp" android:paddingLeft="20dp" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="20dp" android:paddingBottom="@dimen/activity_vertical_margin" card_view:cardCornerRadius="2dp"> <TextView android:id="@+id/info_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!"/> </android.support.v7.widget.CardView> 

L-preview之前的CardView使用RoundRectDrawableWithShadow绘制背景,该背景将重写Drawable.getPadding()以添加阴影填充。 视图背景在膨胀之后通过代码设置,这将覆盖XML中指定的任何填充。

你有两个select:

  1. 在运行时使用View.setPadding()设置填充,注意调整阴影(但仅在L-preview之前)。
  2. 将所有内容放在指定填充的布局中。

后一种select是最安全的。

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="200dp" card_view:cardCornerRadius="2dp"> <FrameLayout android:paddingLeft="20dp" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="20dp" android:paddingBottom="@dimen/activity_vertical_margin"> <TextView android:id="@+id/info_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!"/> </FrameLayout> </android.support.v7.widget.CardView> 

CardView应该使用它附带的contentPadding属性来处理这个问题:

 <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="200dp" card_view:cardCornerRadius="2dp" card_view:contentPaddingLeft="20dp" card_view:contentPaddingRight="@dimen/activity_horizontal_margin" card_view:contentPaddingTop="20dp" card_view:contentPaddingBottom="@dimen/activity_vertical_margin"> <TextView android:id="@+id/info_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!"/> </android.support.v7.widget.CardView> 

如果你想在前L设备上使用CardView填充,并且在Lollipop +设备上看起来相同,那么你将需要使用setUseCompatPadding(true)或XML变体cardUseCompatPadding="true"

这是因为“CardView添加了额外的填充以在L之前的平台上绘制阴影。”[1]因此,默认实现具有不同的API版本,看起来不同,视图可能无法正确排列。 所以,解决这个问题最简单的方法就是上面提到的方法,或者使用margin。

示例代码

 <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="wrap_context" card_view:cardUseCompatPadding="true" card_view:contentPadding="8dp" card_view:cardCornerRadius="4dp" > ... </android.support.v7.widget.CardView> 

来源

[1] CardView.setUseCompatPadding(boolean)

[2] android.support.v7.cardview:cardUseCompatPadding

这是对我有用的东西 – 把每个项目放在一个框架布局

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="-4dp"> <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:background="@color/white_three" android:orientation="vertical" card_view:cardCornerRadius="2dp" card_view:cardElevation="@dimen/card_elevation" card_view:cardMaxElevation="0dp" card_view:cardPreventCornerOverlap="false" card_view:cardUseCompatPadding="true" </android.support.v7.widget.CardView> 

仔细检查card_view是“ http://schemas.android.com/apk/res-auto ”而不是工具,并在帧视图上设置负边距以保持阴影 – 工作正常。