it-roy-ru.com

Как установить отступ для виджета CardView в Android L

Я использую Android:paddingLeft и Android:paddingTop, чтобы установить отступ для нового виджета 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>
58
nomongo

CardView до L-preview использует 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>
58
alanv

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

Если вы хотите использовать заполнение CardView на устройствах до L и иметь одинаковый вид на устройствах 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 (логическое значение)

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

28
Anonsage

Это то, что сработало для меня - поместить каждый элемент в макет кадра 

<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 ", а не инструменты, а также установите отрицательные поля в раме для сохранения теней - работает отлично.

0
Hannah Louisa Carney