【问题标题】:CardView Strange BehaviourCardView 奇怪的行为
【发布时间】:2017-06-07 09:15:05
【问题描述】:

我有一个简单的 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)

如何去除高程和白色背景,为什么会这样?

提前致谢!

【问题讨论】:

  • 你确实有海拔app:cardElevation="2dp"
  • 前段时间我也面临同样的问题。在我的情况下,由于 android:hardwareAccelerated="false" 这个属性在清单文件中
  • 希望对您有所帮助....stackoverflow.com/questions/44407057/…
  • @IvBaranov 这是卡片的高度,应该只影响卡片视图(彩色部分)而不影响其背景(白色部分)
  • @PankajSharma 这个属性在清单中删除了海拔但在所有视图上((所以它不起作用

标签: android view background android-cardview elevation


【解决方案1】:

可能是 API 21 之前实施的一个怪癖。

与此同时,您可能完全不需要 CardView。考虑使用 DrawableResource。

参考How do I set the rounded corner radius of a color drawable using 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 属性

【讨论】:

  • 实际上,我正在使用 'app:cardBackgroundColor' 及其工作 goog 更改卡片背景颜色(您可以看到视图的彩色部分)。但问题是,看起来系统将我的布局包装在另一个具有高程和白色背景的框架布局中。如果我自己将这个布局包装在框架布局中,海拔就会消失,但白色背景仍然存在(我的意思是框架布局的白色背景不是 CardView)。
  • @OlexiiMuraviov 这绝对不是 FrameLayout 的白色背景,因为它默认没有圆角。如果您告诉我们您的设备具有什么 API 级别会有所帮助,因为对于 pre-21 和 pre-17 有不同的 CardView 实现。此外,请参阅新编辑以获取替代方案。如果没有任何帮助,您可以使用 Android 设备监视器转储 XML 层次结构并将其发布在此处。
  • 我已经解决了这个问题。在这个问题stackoverflow.com/questions/34810447/… 中找到答案。感谢你付出的努力!我的布局是一个自定义视图,当我在其构造函数中设置 setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent)) 时,海拔和白色背景已经消失。
  • 是的,考虑到它在不同版本的 Android 中的工作方式,这个答案是有道理的。感谢您的跟进!
【解决方案2】:

原答案是here

我的 latout 用于自定义视图,当我添加 setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));到它的构造函数高度和白色背景已经消失了。

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2018-11-07
    • 2021-06-08
    • 2015-07-20
    相关资源
    最近更新 更多