Как установить дополнение для виджета 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> 

Solutions Collecting From Web of "Как установить дополнение для виджета CardView в Android L"

CardView перед L-preview использует RoundRectDrawableWithShadow для рисования своего фона, который переопределяет Drawable.getPadding() чтобы добавить теневое дополнение. Фон фонового изображения устанавливается через код после инфляции, который переопределяет любое дополнение, указанное в XML.

У вас есть два варианта:

  1. Установите прокладку во время выполнения с помощью View.setPadding() и будьте осторожны, чтобы настроить тени (но только до L-предварительного просмотра!).
  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> 

CardView должен обрабатывать это, используя атрибуты contentPadding с 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> 

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

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

Это то, что сработало для меня – помещение каждого элемента в макет кадра

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