78

我正在使用android:paddingLeftandandroid: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>
4

4 回答 4

208

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>
于 2014-11-11T00:01:28.933 回答
73

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

你有两个选择:

  1. 在运行时使用设置填充View.setPadding()并小心调整阴影(但仅在 L-preview 之前!)。
  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>
于 2014-07-22T20:59:01.930 回答
36

如果您想在 pre-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] CardView.setUseCompatPadding(boolean)

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

于 2014-11-30T16:57:27.020 回答
1

这对我有用 - 将每个项目放在框架布局中

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

于 2017-06-12T12:01:00.453 回答