Странное поведение CardView

У меня есть простой макет с CardView

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/cv_tag"
android:layout_width="wrap_content"
android:layout_height="@dimen/tag_height"
android:layout_margin="4dp"
android:clickable="true"
app:cardCornerRadius="20dp"
app:cardElevation="2dp">

<FrameLayout
    android:id="@+id/fl_selection_indicator"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="8dp"
        android:textAppearance="@style/PrimaryWhiteText.Tiny"
        tools:text="Hard"/>

</FrameLayout>

</android.support.v7.widget.CardView>

И это рендеринг не так, как я ожидаю. Похоже, система оборачивает этот макет в FrameLayout с высотой и белым фоном. Интересно, что если я сам оберну этот макет в FrameLayout, высота исчезнет, ​​​​но белый фон все еще будет (фон макета кадра, а не CardView)

Белый фон Высота

Как убрать возвышение и белый фон и почему это происходит?

Заранее спасибо!


person Olexii Muraviov    schedule 07.06.2017    source источник
comment
У вас действительно есть высота app:cardElevation="2dp"   -  person IvBaranov    schedule 07.06.2017
comment
некоторое время назад я также столкнулся с той же проблемой. В моем случае это связано с тем, что android:hardwareAccelerated=false это свойство в файле манифеста   -  person Pankaj Sharma    schedule 07.06.2017
comment
надеюсь, это поможет вам.... stackoverflow.com/questions/44407057/   -  person Aniruddh Parihar    schedule 07.06.2017
comment
@IvBaranov это высота карты, которая должна влиять только на вид карты (цветная часть), но не на ее фон (белая часть)   -  person Olexii Muraviov    schedule 07.06.2017
comment
@PankajSharma это свойство в манифесте удалило повышение, но во всех представлениях (( так что оно не работает   -  person Olexii Muraviov    schedule 07.06.2017


Ответы (2)


Возможно, это особенность реализации до API 21.

В то же время вам, вероятно, вообще не нужен CardView. Рассмотрите возможность использования DrawableResource.

См. Как установить радиус закругления угла цвета, который можно рисовать с помощью xml?

Старый ответ:

По умолчанию CardView имеет цвет фона, установленный в зависимости от вашей темы. Вот освобождение от стилей

<color name="cardview_dark_background">#FF424242</color>
<color name="cardview_light_background">#FFFFFFFF</color>

И от инициализации представления

if (a.hasValue(R.styleable.CardView_cardBackgroundColor)) {
            backgroundColor = a.getColorStateList(R.styleable.CardView_cardBackgroundColor);
} else {
     // There isn't one set, so we'll compute one based on the theme
     final TypedArray aa = getContext().obtainStyledAttributes(COLOR_BACKGROUND_ATTR);
     final int themeColorBackground = aa.getColor(0, 0);
     aa.recycle();

     // If the theme colorBackground is light, use our own light color, otherwise dark
     final float[] hsv = new float[3];
     Color.colorToHSV(themeColorBackground, hsv);
     backgroundColor = ColorStateList.valueOf(hsv[2] > 0.5f
                    ? getResources().getColor(R.color.cardview_light_background)
                    : getResources().getColor(R.color.cardview_dark_background));
 }

Чтобы изменить цвет, используйте атрибут app:cardBackgroundColor

person vadkou    schedule 07.06.2017
comment
На самом деле, я меняю цвет фона карты с помощью «app:cardBackgroundColor» и его рабочего гуга (вы можете видеть цветную часть представления). Но проблема в том, что система выглядит так, как будто мой макет заключен в другой макет кадра с высотой и белым фоном. И если я сам оберну этот макет в макет кадра, высота исчезнет, ​​​​но белый фон все еще будет (я имею в виду белый фон макета кадра, а не CardView). - person Olexii Muraviov; 07.06.2017
comment
@OlexiiMuraviov Это определенно не белый фон FrameLayout, поскольку по умолчанию он не имеет закругленных углов. Было бы полезно, если бы вы сообщили нам, какой уровень API у вашего устройства, поскольку существуют разные реализации CardView, используемые для версий до 21 и до 17. Кроме того, см. новое редактирование для альтернативы. Если ничего не помогает, вы можете сбросить иерархию XML с помощью Android Device Monitor и опубликовать ее здесь. - person vadkou; 07.06.2017
comment
Да, этот ответ имеет смысл, учитывая, как он работает в разных версиях Android. Спасибо за продолжение! - person vadkou; 10.06.2017

Оригинальный ответ здесь

Мой макет предназначен для пользовательского просмотра, и когда я добавляю setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)); его конструкторам ушли высота и белый фон.

person Olexii Muraviov    schedule 09.06.2017