CardView имеет дополнительный запас в каждом краю на Pre-Lollipop

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

на Lollipop: on Lollipop:

на Pre-Lollipop: on 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"
        >

Ответы

Ответ 1

Таким образом, это совершенно отлично подходит для Kitkat, samsung device, чтобы быть точным.

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

Затем я обнаружил, что из столбца stackoverflow это card_view:cardPreventCornerOverlap="false" и VOILA! Работает! Не было круглых углов (так как я не хотел, чтобы у Карты был фон "Изображение" ).

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

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

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

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

Ответ 2

До L CardView добавляет дополнение к своему контенту и рисует тени в этой области. Это количество дополнений равно maxCardElevation + (1 - cos45) * cornerRadius по бокам и maxCardElevation * 1.5 + (1 - cos45) * cornerRadius сверху и снизу.

Из справки 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, это своего рода хакерский способ сделать это.

Ответ 3

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

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

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

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

источник docs

Ответ 4

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

Ответ 5

Чтобы решить проблему "теневого пространства" для версий 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);
    }
}

Ответ 6

Если требуется 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 могут быть скорректированы для вашего макета, так как они зависят от высоты и т.д.

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