Xamarin.Android CardView

Cardview 小组件是一个 UI 组件,可在类似于卡片的视图中显式文本和图像内容。 本指南介绍如何在 Xamarin.Android 应用程序中使用和自定义 CardView,同时与早期版本的 Android 保持向后兼容性。

概述

Android 5.0 (Lollipop) 中引入的 Cardview 小组件是一个 UI 组件,可在类似于卡片的视图中显示文本和图像内容。 CardView 实现为带圆角和阴影的 FrameLayout 小组件。 通常,CardView 用于在 ListViewGridView 视图组中显示单个行项。 例如,以下屏幕截图是一个旅行预订应用示例,在可滚动的 ListView 中实现基于 CardView 的旅行目的地卡:

Example app using a CardView for each travel destination

本指南介绍如何在应用中将 CardView 包添加到 Xamarin.Android 项目、如何将 CardView 添加到布局以及如何自定义 CardView 的外观。 此外,本指南提供了可以更改的 CardView 属性的详细列表,包括有助于在 Android 5.0 Lollipop 之前的 Android 版本上使用 CardView 的属性。

要求

在基于 Xamarin 的应用中使用新的 Android 5.0 及更高版本功能(包括 CardView)需要以下条件:

  • Xamarin.Android - 必须安装 Xamarin.Android 4.20 或更高版本并配置 Visual Studio 或 Visual Studio for Mac。

  • Android SDK - 必须通过 Android SDK 管理器安装 Android 5.0 (API 21) 或更高版本。

  • Java JDK 1.8 – 如果你专门面向 API 级别 23 及更早版本,可以使用 JDK 1.7。 JDK 1.8 可从 Oracle 获取。

应用还必须包含该 Xamarin.Android.Support.v7.CardView 包。 若要在 Visual Studio for Mac 中添加 Xamarin.Android.Support.v7.CardView 包,请执行以下操作:

  1. 打开项目,右键单击“包”,然后选择“添加包”

  2. 在“添加包”对话框中,搜索“CardView”

  3. 选择“Xamarin 支持库 v7 CardView”,然后单击“添加包”

若要在 Visual Studio 中添加 Xamarin.Android.Support.v7.CardView 包,请执行以下操作:

  1. 打开项目,(在“解决方案资源管理器”窗格中)右键单击“引用”节点,然后选择“管理 NuGet 包...”

  2. 显示“管理 NuGet 包”对话框时,在搜索框中输入“CardView”

  3. 出现“Xamarin 支持库 v7 CardView”时,单击“安装”

若要了解如何配置 Android 5.0 应用项目,请参阅设置 Android 5.0 项目。 有关安装 NuGet 包的详细信息,请参阅演练:在项目中包括 NuGet

CardView 简介

默认 CardView 类似于一张白色卡片,带轻微的阴影,且边角为非常细微的圆角。 以下示例 Main.axml 布局显示包含 TextView 的单个 CardView 小组件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_horizontal"
    android:padding="5dp">
    <android.support.v7.widget.CardView
        android:layout_width="fill_parent"
        android:layout_height="245dp"
        android:layout_gravity="center_horizontal">
        <TextView
            android:text="Basic CardView"
            android:layout_marginTop="0dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />
    </android.support.v7.widget.CardView>
</LinearLayout>

如果使用此 XML 替换 Main.axml 的现有内容,请务必注释掉 MainActivity.cs 中引用上一 XML 中的资源的任何代码

此布局示例使用单行文本创建默认的 CardView,如以下屏幕截图所示:

Screenshot of CardView with white background and line of text

在此示例中,应用样式设置为浅色材料主题 (Theme.Material.Light),以便 CardView 阴影和边缘更易于查看。 有关确定 Android 5.0 应用主题的详细信息,请参阅材料主题。 在下一节,我们将了解如何为应用程序自定义 CardView

自定义 CardView

可以修改基本 CardView 属性以自定义应用中 CardView 的外观。 例如,可以增加 CardView 的高程以投射更大的阴影(这使得卡片似乎漂浮在背景上方)。 此外,可以增加圆角半径,使卡片的角更圆。

在下一个布局示例中,自定义的 CardView 用于创建打印照片的模拟(“快照”)。 ImageView 添加到 CardView 用于显示图像,TextView 放在 ImageView 下,用于显示图像标题。 在此示例布局中,CardView 采用以下自定义:

  • cardElevation 增加到 4dp,以投出更大的阴影。
  • cardCornerRadius 增加到 5dp,使边角看起来更圆。

由于 Android v7 支持库提供了 CardView,因此 android: 命名空间中未提供其属性。 因此,必须定义自己的 XML 命名空间,并将该命名空间用作 CardView 属性前缀。 在下面的布局示例中,我们将使用此行来定义一个名为 cardview 的命名空间:

    xmlns:cardview="http://schemas.android.com/apk/res-auto"

你可以调用此命名空间 card_view,如果选择,甚至还可以调用 myapp(它只能在此文件的范围内访问)。 无论是否选择调用此命名空间,都必须使用它来为要修改的 CardView 属性添加前缀。 在此布局示例中,cardview 命名空间是 cardElevationcardCornerRadius 的前缀:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cardview="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_horizontal"
    android:padding="5dp">
    <android.support.v7.widget.CardView
        android:layout_width="fill_parent"
        android:layout_height="245dp"
        android:layout_gravity="center_horizontal"
        cardview:cardElevation="4dp"
        cardview:cardCornerRadius="5dp">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="240dp"
            android:orientation="vertical"
            android:padding="8dp">
            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="190dp"
                android:id="@+id/imageView"
                android:scaleType="centerCrop" />
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#333333"
                android:text="Photo Title"
                android:id="@+id/textView"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="5dp" />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

当此布局示例用于在照片查看应用中显示图像时,CardView 具有照片快照的外观,如以下屏幕截图所示:

CardView with an image and caption below the image

此屏幕截图取自 RecyclerViewer 示例应用,该应用使用 RecyclerView 小组件显示用于查看照片的 CardView 图像滚动列表。 有关 RecyclerView 的详细信息,请参阅 RecyclerView 指南。

请注意,CardView 可以在其内容区域中显示多个子视图。 例如,在上面的照片查看应用示例中,内容区域由包含 ImageViewTextViewListView 组成。 虽然 CardView 实例通常垂直排列,但也可以将其水平排列(请参阅创建自定义视图样式以获取示例屏幕截图)。

CardView 布局选项

CardView 布局可以通过设置一个或多个影响其填充、高程、圆角半径和背景色的属性来自定义:

Diagram of CardView attributes

还可以通过调用对应 CardView 方法来动态更改每个属性(有关 CardView 方法的详细信息,请参阅 CardView 类引用)。 请注意,这些属性(背景色除外)都接受一个尺寸值,该值是一个十进制数,后跟单位。 例如,11.5dp 指定 11.5 个与密度无关的像素。

填充

CardView 提供五个填充属性来定位卡片中的内容。 可以在布局 XML 中设置它们,也可以在代码中调用类似方法:

Diagram of CardView padding attributes

填充属性如下所述:

  • contentPaddingCardView 的子视图与卡片的所有边缘之间的内部填充。

  • contentPaddingBottomCardView 的子视图与卡片的底部边缘之间的内部填充。

  • contentPaddingLeftCardView 的子视图与卡片的左侧边缘之间的内部填充。

  • contentPaddingRightCardView 的子视图与卡片的右侧边缘之间的内部填充。

  • contentPaddingTopCardView 的子视图与卡片的顶部边缘之间的内部填充。

内容填充属性相对于内容区域的边界,而不是内容区域中任何给定小组件。 例如,如果 contentPadding 在照片查看应用中已充分增加,则 CardView 会裁剪图像和卡片上显示的文本。

Elevation

CardView 提供两个高程属性来控制高程,因此其阴影的大小如下:

Diagram of CardView elevation attributes

高程属性如下所述:

  • cardElevationCardView 的高程(代表其 Z 轴)。

  • cardMaxElevationCardView 高程的最大值。

cardElevation 的值越大,阴影大小就越大,从而使 CardView 看起来更高地悬浮于背景之上。 cardElevation 属性还确定重叠视图的绘制顺序;也就是说, CardView 将绘制在具有较高高程设置的另一个重叠视图下,在具有较低高程设置的任何重叠视图上。 当应用动态更改高程时,cardMaxElevation 设置非常有用 - 它会阻止阴影超出你使用此设置定义的限制。

圆角半径和背景色

CardView 提供可用于控制其圆角半径和背景色的属性。 这两个属性允许更改 CardView 的整体样式:

Diagram of CardView corner radious and background color attributes

这些属性如下所述:

  • cardCornerRadiusCardView 的所有角的圆角半径。

  • cardBackgroundColorCardView 的背景色。

在此示意图中,cardCornerRadius 设置为更圆的 10dp,而 cardBackgroundColor 设置为 "#FFFFCC"(浅黄色)。

兼容性

可以在低于 Android 5.0 Lollipop 的 Android 版本上使用 CardView。 由于 CardView 是 Android v7 支持库的一部分,因此可将 CardView 与 Android 2.1(API 级别 7)及更高版本一起使用。 但是,必须按照上述要求安装 Xamarin.Android.Support.v7.CardView 包。

CardView 在操作系统版本低于 Lollipop(API 级别 21)的设备上表现出略有不同的行为:

  • CardView 使用可添加其他填充的编程阴影实现。

  • CardView 不会剪裁与 CardView 的圆角相交的子视图。

为了帮助管理这些兼容性差异,CardView 提供了可在布局中配置的其他几个属性:

  • cardPreventCornerOverlap – 将此属性设置为 true,以便在早期 Android 版本(API 级别 20 及更早版本)上运行应用时添加填充。 此设置可防止 CardView 内容与 CardView 的圆角相交。

  • cardUseCompatPadding – 将此属性设置为 true,以便在大于或等于 API 级别 21 的 Android 版本上运行应用时添加填充。 如果要在 Lollipop 之前的设备上使用 CardView,并让它在 Lollipop(或更高版本)上看起来一样,请将此属性设置为 true。 启用此属性后,CardView 在 Lollipop 之前的设备上运行时,会添加额外的填充来绘制阴影。 这有助于克服在 Lollipop 之前的编程阴影实现生效时引入填充差异。

有关维护与早期版本的 Android 的兼容性的详细信息,请参阅 维护兼容性

总结

本指南介绍了 Android 5.0 (Lollipop) 中包含的新 CardView 小组件。 它演示了默认的 CardView 外观,并说明了如何通过更改其高程、边角圆度、内容填充和背景色来自定义 CardView。 它列出了 CardView 布局属性(带有参考关系图),并说明了如何在低于 Android 5.0 Lollipop 的 Android 设备上使用 CardView。 有关 CardView 的详细信息,请参阅 CardView 类引用