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

时间:2014-07-22 19:31:07

标签: android padding android-5.0-lollipop android-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>

4 个答案:

答案 0 :(得分:170)

CardView应使用contentPadding attributes it comes with

处理此问题
<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 :(得分:57)

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

您有两种选择:

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

    <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>
    

答案 2 :(得分:29)

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

这是因为&#34; CardView添加额外的填充以在L之前在平台上绘制阴影。&#34; [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

答案 3 :(得分: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”而非工具,并在框架视图上设置负边距以保持阴影 - 工作正常。