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

4 ответов:

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>

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

Comments

    Ничего не найдено.