CardView 默认高程值

Posted

技术标签:

【中文标题】CardView 默认高程值【英文标题】:CardView default elevation value 【发布时间】:2020-06-21 04:20:29 【问题描述】:

我正在尝试在我的 CardView 上显示一个徽章(粉红色 TextView),如下所示:

CardView的elevation值没有设置,所以应该是默认的,badge的elevation设置为2dp

API Level > 22 没有问题,但API Level <= 22 的徽章如下所示停留在 CardView 下:

当我将徽章的高度值从 2dp 更改为 2.285738dp 时,它就可以工作了。

我最初的想法是 CardView 的默认高度值会根据 API 级别而变化。想在这里发帖以找出更合乎逻辑的原因。

<androidx.constraintlayout.widget.ConstraintLayout 
    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:layout_
    android:layout_
    android:clipToPadding="false"
    android:paddingBottom="8dp">

<androidx.cardview.widget.CardView
    android:layout_
    android:layout_
    android:layout_marginStart="@dimen/margin_horizontal_default"
    android:layout_marginTop="@dimen/margin_inner_half_default"
    android:layout_marginEnd="@dimen/margin_horizontal_half_default"
    android:foreground="?android:attr/selectableItemBackground"
    app:cardBackgroundColor="?backgroundCardColor"
    app:cardCornerRadius="@dimen/card_corner_radius"
    app:layout_constraintTop_toTopOf="parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_>

        <ImageView
            android:id="@+id/accountImage"
            android:layout_
            android:layout_
            android:layout_marginStart="@dimen/margin_inner_default"
            android:src="@drawable/ic_account"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginStart="8dp"
            android:orientation="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toEndOf="@+id/accountImage"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/accountIdText"
                style="@style/TextStyle.SemiBoldActiveMedium"
                android:layout_
                android:layout_
                tools:text="12058.01" />

            <TextView
                android:id="@+id/accountTypeText"
                style="@style/TextStyle.BoldSmallInactive"
                android:layout_
                android:layout_
                android:layout_marginTop="2dp"
                tools:text="Collection" />

        </LinearLayout>

        <TextView
            android:id="@+id/tvAmountView"
            style="@style/TextStyle.BoldPrime"
            android:layout_
            android:layout_
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="1dp"
            android:textSize="15sp"
            app:layout_constraintBottom_toBottomOf="@id/ivChevron"
            app:layout_constraintEnd_toStartOf="@+id/tvAmountCurrency"
            app:layout_constraintTop_toTopOf="@id/ivChevron"
            tools:text="13,592.04" />

        <TextView
            android:id="@+id/tvAmountCurrency"
            style="@style/TextStyle.BoldSmallInactive"
            android:layout_
            android:layout_
            android:layout_marginStart="4dp"
            android:layout_marginEnd="4dp"
            app:layout_constraintBottom_toBottomOf="@id/ivChevron"
            app:layout_constraintEnd_toStartOf="@id/ivChevron"
            app:layout_constraintTop_toTopOf="@id/ivChevron"
            tools:text="KES" />

        <ImageView
            android:id="@+id/ivChevron"
            android:layout_
            android:layout_
            android:layout_marginEnd="@dimen/margin_inner_default"
            android:src="@drawable/ic_chevron_right"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

<TextView
    android:id="@+id/accountCurrencyText"
    style="@style/TextStyle.InvertedTag"
    android:layout_
    android:layout_
    android:layout_marginStart="@dimen/margin_horizontal_half_default"
    android:background="@drawable/background_inverted_secondary"
    android:elevation="2dp"
    android:gravity="center_vertical"
    android:paddingStart="12dp"
    android:paddingEnd="12dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="KES" />

【问题讨论】:

【参考方案1】:

请尝试用androidx.TextView 替换您的TextView,看看是否有效。

【讨论】:

这会在 LayoutInflater 中自动发生,您绝对不必在 xml 文件中使用 androidx TextViews 或 ImageViews。 不幸的是,替换为 androidx 并没有改变行为。 你的style="@style/TextStyle.InvertedTag"android:foreground="?android:attr/selectableItemBackground"是做什么的? 您的TextViewCardView 布局的一部分吗?我假设在您的CardView 中,您拥有所有这些带有图像、文本等的视图。我会为CardView 设置一些填充/边距,可能在FrameLayoutConstraintLayout 中设置CardView,然后在层次结构中CardView 下方的徽章,以便它始终显示在CardView 的顶部。 更改为 AppCompatTextView 不起作用,但从 androidx.cardview.widget.CardView 更改为 com.google.android.material.card.MaterialCardView 确实:)【参考方案2】:

我之前遇到过这个问题,并通过为两个项目设置elevation 来解决它,在后台,我设置2sp,在前台设置4sp。它工作得很好。 CardView 的默认值为 2dp

【讨论】:

似乎对于 Api Level 2dp,因为徽章仅以高度2.285738dp 出现在前台。

以上是关于CardView 默认高程值的主要内容,如果未能解决你的问题,请参考以下文章

markdown CardView高程和波纹

CardView的优缺点

Android去除CardView默认的阴影

DevExpress GridControl 关于使用CardView的一点小结

折叠 CardView 动画无法正常工作

Android RecycleView + CardView 控件简析