创建自定义通知布局

为了使您的通知在不同版本的 Android 上看起来最佳,请使用 标准通知模板 来构建您的通知。如果您想在通知中提供更多内容,请考虑使用其中一个 可扩展通知模板.

但是,如果系统模板不能满足您的需求,您可以使用自己的通知布局。

为内容区域创建自定义布局

如果您需要自定义布局,可以将 NotificationCompat.DecoratedCustomViewStyle 应用于您的通知。此 API 允许您为通常由标题和文本内容占据的内容区域提供自定义布局,同时仍然使用系统装饰来装饰通知图标、时间戳、子文本和操作按钮。

此 API 的工作方式类似于 可扩展通知模板,它基于基本通知布局构建,如下所示

  1. 使用 NotificationCompat.Builder 构建一个 基本通知.
  2. 调用 setStyle(),并将 NotificationCompat.DecoratedCustomViewStyle 的实例传递给它。
  3. 将您的自定义布局作为 RemoteViews 的实例膨胀。
  4. 调用 setCustomContentView() 来设置折叠通知的布局。
  5. 可以选择调用 setCustomBigContentView() 来设置展开通知的不同布局。

准备布局

您需要一个 small 和一个 large 布局。对于此示例,small 布局可能如下所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/notification_title"
        style="@style/TextAppearance.Compat.Notification.Title"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Small notification, showing only a title" />
</LinearLayout>

large 布局可能如下所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/notification_title"
        style="@style/TextAppearance.Compat.Notification.Title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Large notification, showing a title and a body." />

    <TextView
        android:id="@+id/notification_body"
        style="@style/TextAppearance.Compat.Notification.Line2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="This is the body. The height is manually forced to 300dp." />
</LinearLayout>

构建并显示通知

布局准备就绪后,您可以按照以下示例中的步骤使用它们

Kotlin

val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

// Get the layouts to use in the custom notification.
val notificationLayout = RemoteViews(packageName, R.layout.notification_small)
val notificationLayoutExpanded = RemoteViews(packageName, R.layout.notification_large)

// Apply the layouts to the notification.
val customNotification = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setStyle(NotificationCompat.DecoratedCustomViewStyle())
        .setCustomContentView(notificationLayout)
        .setCustomBigContentView(notificationLayoutExpanded)
        .build()

notificationManager.notify(666, customNotification)

Java

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// Get the layouts to use in the custom notification
RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.notification_small);
RemoteViews notificationLayoutExpanded = new RemoteViews(getPackageName(), R.layout.notification_large);

// Apply the layouts to the notification.
Notification customNotification = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
        .setCustomContentView(notificationLayout)
        .setCustomBigContentView(notificationLayoutExpanded)
        .build();

notificationManager.notify(666, customNotification);

请注意,通知的背景颜色可能会因设备和版本而异。将支持库样式(如 TextAppearance_Compat_Notification 用于文本,TextAppearance_Compat_Notification_Title 用于标题)应用于您的自定义布局,如以下示例所示。这些样式会适应颜色变化,因此您不会出现黑色文本在黑色背景上或白色文本在白色背景上的情况。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:text="@string/notification_title"
    android:id="@+id/notification_title"
    style="@style/TextAppearance.Compat.Notification.Title" />

避免在您的 RemoteViews 对象上设置背景图像,因为您的文本可能变得不可读。

当您在用户使用应用时触发通知时,结果类似于图 1

An image showing a collapsed notification
图 1. 使用其他应用时,会出现小型通知布局。

点击扩展箭头会展开通知,如图 2 所示

An image showing an expanded notification in the system bar
图 2. 使用其他应用时,会出现大型通知布局。

通知超时后,通知仅在系统栏中可见,如图 3 所示

An image showing a collapsed notification in the system bar
图 3. 小型通知布局在系统栏中的显示方式。

点击扩展箭头会展开通知,如图 4 所示

An image showing an expanded notification in the system bar
图 4. 大型通知布局在系统栏中的显示方式。

创建完全自定义的通知布局

如果您不希望您的通知用标准通知图标和标题进行装饰,请按照前面的步骤操作,但不要调用 setStyle()