CardView има допълнителен марж във всеки ръб на Pre-Lollipop

Ето две снимки.

на Lollipop: на 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" и ВОАЛА! Работи! Нямаше заоблени ъгли (тъй като не исках нито един, тъй като картата има фон на изображението).

Моралът е, че допълнителната подложка е заради тези малки кръгли ъгли, които трябва да бъдат деактивирани. По принцип това не е недостатък, а ограничение на дизайна!

ОРИГИНАЛЕН SOF ОТГОВОР

Изображение: Забележете, че горните ъгли са ръбове (изглед, който има цвят и изображение във фонов режим), докато долният има само 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) * 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, това е един вид хакерски начин да го направите.

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 (преди близалката), добавянето на 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, тъй като получаваме динамично стойностите на padding и 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