Как установить дополнение для виджета CardView в Android L
я использую android:paddingLeft и android: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>
4 ответов:
CardView до L-preview использует
RoundRectDrawableWithShadowчтобы нарисовать его фон, который переопределяетDrawable.getPadding()для добавления теневого заполнения. Фон представления устанавливается с помощью кода после инфляции, который переопределяет любое заполнение, указанное в XML.у вас есть два варианта:
- установить заполнение во время выполнения с помощью
View.setPadding()и будьте осторожны, чтобы настроить для теней (но только до L-preview!).- Поместите все внутри макета, который определяет заполнение.
последний вариант является самым безопасным.
<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атрибуты он поставляется с:<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 padding на устройствах pre-L, и он будет выглядеть одинаково на устройствах Lollipop+, то вам нужно будет использовать
setUseCompatPadding(true), или вариант XMLcardUseCompatPadding="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>источник
Это то, что сработало для меня - положить каждый элемент в макет кадра
<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 " и не инструменты, а также установить отрицательные поля на вид кадра для поддержания тени - отлично работает.
Comments