How to set the padding for CardView widget in Android L
I'm using android:paddingLeft
and android:paddingTop
to set the padding for the new CardView
widget but it doesn't work.
I can set the margin for all the controls inside the CardView
as a workaround but that's a pain if there are too many controls.
How to set padding for the new cardview widget?
<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>
Solution 1:
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>
Solution 2:
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:
- Set padding at run time using
View.setPadding()
and be careful to adjust for the shadows (but only prior to L-preview!). - 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>