如何在 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>
63564 次浏览

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

你有两个选择:

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

后一种选择是最安全的。

<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 版本,看起来不同,视图可能不会正确排列。因此,解决这个问题的最简单方法就是使用上面提到的方法,或者使用边距。

示例代码

<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] SetUseCompatPadd (boolean)

[2] Carview: cardUseCompatPaddingandroid.support. v7.carview: cardUseCompatPaddingandroid.support

这就是我的工作-把每个项目在一个框架布局

<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”而不是工具,并且在框架视图上设置负边距以保持阴影效果。