如何在Android L中为CardView小部件设置填充
我正在使用android:paddingLeft
和android: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:
- 在运行时使用
View.setPadding()
设置填充,注意调整阴影(但仅在L-preview之前)。 - 将所有内容放在指定填充的布局中。
后一种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 ”而不是工具,并在帧视图上设置负边距以保持阴影 – 工作正常。