为了使您的通知在不同版本的 Android 上看起来最佳,请使用 标准通知模板 来构建您的通知。如果您想在通知中提供更多内容,请考虑使用其中一个 可扩展通知模板.
但是,如果系统模板不能满足您的需求,您可以使用自己的通知布局。
为内容区域创建自定义布局
如果您需要自定义布局,可以将 NotificationCompat.DecoratedCustomViewStyle
应用于您的通知。此 API 允许您为通常由标题和文本内容占据的内容区域提供自定义布局,同时仍然使用系统装饰来装饰通知图标、时间戳、子文本和操作按钮。
此 API 的工作方式类似于 可扩展通知模板,它基于基本通知布局构建,如下所示
- 使用
NotificationCompat.Builder
构建一个 基本通知. - 调用
setStyle()
,并将NotificationCompat.DecoratedCustomViewStyle
的实例传递给它。 - 将您的自定义布局作为
RemoteViews
的实例膨胀。 - 调用
setCustomContentView()
来设置折叠通知的布局。 - 可以选择调用
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
点击扩展箭头会展开通知,如图 2 所示
通知超时后,通知仅在系统栏中可见,如图 3 所示
点击扩展箭头会展开通知,如图 4 所示
创建完全自定义的通知布局
如果您不希望您的通知用标准通知图标和标题进行装饰,请按照前面的步骤操作,但不要调用 setStyle()
。