How to set the padding for CardView widget in Android L How to set the padding for CardView widget in Android L android android

How to set the padding for CardView widget in Android L


CardView should handle this using the 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>


CardView prior to L-preview uses RoundRectDrawableWithShadow to draw its background, which overrides Drawable.getPadding() to add shadow padding. The view background gets set via code after inflation, which overrides any padding specified in XML.

You have two options:

  1. Set padding at run time using View.setPadding() and be careful to adjust for the shadows (but only prior to L-preview!).
  2. Place everything inside a layout that specifies padding.

The latter option is safest.

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


If you want to use CardView padding on pre-L devices, and have it look the same on Lollipop+ devices, then you will need to use setUseCompatPadding(true), or the XML variant cardUseCompatPadding="true".

This is because "CardView adds additional padding to draw shadows on platforms before L."[1] So, the default implementation has the different API versions looking different and views may not line up properly. So, the easiest way to fix that issue is the ways stated above, or use margins instead.

Example Code

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

Sources

[1] CardView.setUseCompatPadding(boolean)

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