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

nom*_*ngo 61 android padding android-cardview android-5.0-lollipop

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

yar*_*ian 182

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>
Run Code Online (Sandbox Code Playgroud)

  • @yarian根本没回答我的问题.实际上它只是让事情变得更糟.不确定Android开发人员如何能够对此进行排序 (6认同)

ala*_*anv 63

L-preview之前的CardView RoundRectDrawableWithShadow用于绘制其背景,该覆盖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>
Run Code Online (Sandbox Code Playgroud)

  • OP至少有第三种选择:接受yarian的回答. (12认同)

Ano*_*age 30

如果你想在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>
Run Code Online (Sandbox Code Playgroud)

来源

[1] CardView.setUseCompatPadding(boolean)

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