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


71

我正在使用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预览版或其他OS版本上进行测试?
alanv 2014年

在Kitkat 4.4.4上进行测试。显示出cardview,除填充外,其他所有内容看起来都不错。
nomongo 2014年

Answers:


67

L预览之前的CardViewRoundRectDrawableWithShadow用于绘制其背景,该背景会被覆盖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>

16
OP至少有第三个选择:接受yarian的回答。
Michel Jung 2015年

@ MichelJung,yarian的答案在Android 4.1.2上对我不起作用,因此,按照此答案中的建议使用包装器可能是一个更安全的选择。
山姆

194

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>

1
由于在CardView上定义“ padding”属性毫无意义,为什么cardview无法将padding属性复制到其自己的内部contentPadding中?我们只是应该记得/知道CardView有一个叫做contentPadding的东西,我们应该使用它而不是padding?@MichelJung
Greg Ennis

1
@GregEnnis因为定义CardView的填充确实有意义。实际上,Android系统就是这样做的:Before L, CardView adds padding to its content and draws shadows to that area. This padding amount is equal to maxCardElevation + (1 - cos45) * cornerRadius on the sides and maxCardElevation * 1.5 + (1 - cos45) * cornerRadius on top and bottom.将填充应用于卡片背景的填充与内部内容填充区别开来。
yarian

6
@yarian根本没有回答我的问题。实际上,这只会使情况变得更糟。不确定是否可以期望有人接触Android开发
Greg Ennis,

1
@yarian知道如何card_view:contentPadding在自定义样式(styles.xml)中指定吗?
乔塔姆,2015年

这对于运行Android 7.1的手机非常适合我。但是,它对运行Android 4.1.2的其他手机没有影响。
山姆

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


那正是我所需要的。谢谢!
Aci89

即使设置了card_view:cardUseCompatPadding="true",在运行Android 4.1.2的手机上也没有填充。
山姆

完善。谢谢。
Gerson C Filho

0

这就是我的工作-将每个项目放置在框架布局中

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.