CardView имеет дополнительное поле на каждом крае на Pre-Lollipop

Вот две картинки.

на леденце: на леденце:

на Pre-Lollipop: на Pre-Lollipop

мы можем видеть, что это просто близко к стороне экрана на Lollipop. это то, что я хочу. но на устройстве Pre-Lollipop у него есть дополнительный запас до края экрана. ребята у вас есть опыт? благодарю вас.

вот макет xml:

<android.support.v7.widget.CardView
        android:id="@+id/card_title_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        app:cardCornerRadius="0dp"
        app:cardBackgroundColor="@color/colorAccent"
        >

person Jaden Gu    schedule 16.03.2015    source источник


Ответы (7)


Так что здесь все отлично работает на Kitkat, а точнее на устройстве Samsung.

Я пробовал card_view:cardUseCompatPadding="true", но безрезультатно. Не работает!

Затем я обнаружил из сообщения stackoverflow это card_view:cardPreventCornerOverlap="false" и ВОИЛЯ! Работал! Не было закругленных углов (поскольку я не хотел их, поскольку у карты есть фоновое изображение).

Мораль в том, что дополнительные отступы связаны с теми крошечными круглыми углами, которые необходимо отключить. По сути, это не недостаток, а ограничение дизайна!

ОРИГИНАЛЬНЫЙ ОТВЕТ

Изображение: обратите внимание, что верхние углы являются краями (представление, которое имеет цвет и изображение в фоновом режиме), а нижние имеют только TextViews и не имеют фона, следовательно, закругленные углы. Это означает, что если представление запрашивает match_parent внутри CardView, card_view:cardPreventCornerOverlap="false" позволит его использовать в затронутых углах.

введите описание изображения здесь

person sud007    schedule 30.06.2016
comment
Он работает в этой библиотеке поддержки, изменив его на false. Я думаю, может быть, Google исправил это молча. - person Jaden Gu; 23.08.2016
comment
Спасибо; это сделало проблему гораздо менее заметной. Однако на моем Sony Xperia M (Android 4.1.2) вокруг cardView все еще оставалось один или два пикселя поля/отступа. - person Sam; 23.04.2017
comment
Это сработало для меня: android.jlelse.eu/< /а> - person Sagar Patel; 15.11.2017
comment
Но это также противоречит одной из двух основных целей CardView: одна — это тень, которую вы сохранили, а другая — закругленные углы, независимо от того, какие представления находятся внутри. К сожалению, мне нужны закругленные углы, а также тень, так что это мне не поможет. - person milosmns; 12.09.2019

Перед L CardView добавляет отступы к своему содержимому и рисует тени в этой области. Эта величина отступа равна maxCardElevation + (1 - cos45) * угловой радиус по бокам и maxCardElevation * 1,5 + (1 - cos45) * угловой радиус сверху и снизу.

Из справочника CardView здесь

Попробуйте установить отрицательное левое поле для CardView вот так

<android.support.v7.widget.CardView
        android:id="@+id/card_title_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        app:cardCornerRadius="0dp"
        app:cardBackgroundColor="@color/colorAccent" 
        app:cardUseCompatPadding="true"
        android:layout_marginLeft="-2dp" />

Возможно, вам придется отрегулировать поле, чтобы получить желаемый результат.

PS, это своего рода хакерский способ сделать это.

person shemarcl    schedule 19.03.2015
comment
Спасибо за ваш ответ. ты прав. Я не заметил, чтобы тени отрисовывались в эту область.. Возможно, хак пока единственный. иначе я не должен использовать CardView в этом состоянии. - person Jaden Gu; 20.03.2015
comment
Пожалуйста. Это единственный способ, о котором я могу думать прямо сейчас. Если вы найдете лучший способ рисовать тени на устройствах с леденцами, дайте мне знать. РЕДАКТИРОВАТЬ: Вот кое-что, с чем я только что столкнулся: github.com/dmytrodanylyk/shadow -layout Я думаю, что он рисует тени таким же образом. Не стесняйтесь проверить это. - person shemarcl; 21.03.2015

Я понимаю, что на этот вопрос уже был дан ответ, но я хотел бы добавить, что в дополнение к card_view:cardPreventCornerOverlap="false" мне также пришлось установить CardView.setMaxCardElevation(0), чтобы избавиться от полей в pre-Lollipop. Установка высоты только на 0 не сработала. Я использую библиотеку поддержки v23.4.0.

person okacat    schedule 09.12.2016
comment
Спасибо за указатель setMaxCardElevation. В моем случае, чтобы избавиться от лишнего отступа от всех краев (даже когда в CardView или его дочерних элементах не было углового радиуса) мне пришлось установить эти 3 (в xml): app:cardMaxElevation="0dp" app:cardElevation="0dp" app:cardPreventCornerOverlap="false"... Используя < b>com.android.support:cardview-v7:25.2.0 - person Vinay Vissh; 07.03.2017
comment
Я исправил с вашим комментарием. Спасибо. - person semih; 05.04.2018

Попробуйте с card_view:cardUseCompatPadding="true"

если мы установим для этого свойства значение true, то margin будет работать одинаково во всех версиях.

примечание разработчика

Добавьте заполнение в API v21+, чтобы иметь те же измерения, что и в предыдущих версиях.

исходные документы

person Sanket Kachhela    schedule 29.04.2015

Если желательно поведение Android 4 (pre-lollipop), добавление app:cardUseCompatPadding="true" к CardView должно исправить это.

Если желательно поведение Android 5+ (что на самом деле является правильным поведением карточек в соответствии с руководящими принципами материалов), то добиться того же самого не так-то просто. Я обычно использую это исправление, чтобы избежать определения нескольких файлов макета и иметь разумный вывод на всех устройствах:

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:contentPaddingRight="@dimen/fix_cardview"
    app:contentPaddingLeft="@dimen/fix_cardview"
    app:contentPaddingTop="@dimen/fix_cardview_vertical"
    app:contentPaddingBottom="@dimen/fix_cardview_vertical" />

и в обычном файле values/dimens.xml у нас должно быть:

<dimen name="fix_cardview">-8dp</dimen>
<dimen name="fix_cardview_vertical">-12dp</dimen>

и в values-v21/dimens.xml:

<dimen name="fix_cardview">0dp</dimen>
<dimen name="fix_cardview_vertical">0dp</dimen>

обратите внимание, что числа -8dp и -12dp, возможно, придется скорректировать для вашего макета, так как они зависят от высоты и т. д.

Это всего лишь обходной путь, чтобы избежать уродливых дополнений в представлениях Android 4 без использования разных представлений в разных файлах макета (что обычно затрудняет поддержку кода).

person Iman Akbari    schedule 03.01.2017

Чтобы решить проблему «теневого пространства» для версий PRE-L, вы можете динамически обновлять поле CardView отрицательными значениями, чтобы компенсировать пространство.

Чтобы получить реальное теневое пространство:

shadowSpaceLeft = getPaddingLeft() - getContentPaddingLeft();

Чтобы исправить поля:

layoutParams.leftMargin -= shadowSpaceLeft;

Это будет работать для всех версий Android, поскольку мы динамически получаем значения отступов и значений contentPadding.

Например, вот класс, который делает это всякий раз, когда мы устанавливаем новые параметры макета:

public class NoPaddingCardView extends CardView {

    public NoPaddingCardView(Context context) {
        super(context);
        init();
    }

    public NoPaddingCardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public NoPaddingCardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        // Optional: Prevent pre-L from adding inner card padding 
        setPreventCornerOverlap(false);
        // Optional: make Lollipop and above add shadow padding to match pre-L padding
        setUseCompatPadding(true);
    }

    @Override
    public void setLayoutParams(ViewGroup.LayoutParams params) {
        // FIX shadow padding
        if (params instanceof MarginLayoutParams) {
            MarginLayoutParams layoutParams = (MarginLayoutParams) params;
            layoutParams.bottomMargin -= (getPaddingBottom() - getContentPaddingBottom());
            layoutParams.leftMargin -= (getPaddingLeft() - getContentPaddingLeft());
            layoutParams.rightMargin -= (getPaddingRight() - getContentPaddingRight());
            layoutParams.topMargin -= (getPaddingTop() - getContentPaddingTop());
        }

        super.setLayoutParams(params);
    }
}
person Eyal Biran    schedule 07.03.2016

просто добавьте это в свой код для предварительных версий леденцов:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
    {
        cardView.setMaxCardElevation(0f);
        cardView.setPreventCornerOverlap(false);
    }
person AREF    schedule 22.09.2018