Damit deine Benachrichtigungen in verschiedenen Android-Versionen optimal dargestellt werden, solltest du für die Erstellung von Benachrichtigungen die Standardbenachrichtigungsvorlage verwenden. Wenn Sie mehr Inhalte in Ihrer Benachrichtigung angeben möchten, sollten Sie eine der Expandable-Benachrichtigungsvorlagen verwenden.
Wenn die Systemvorlagen jedoch nicht Ihren Anforderungen entsprechen, können Sie Ihr eigenes Layout für die Benachrichtigung verwenden.
Benutzerdefiniertes Layout für den Inhaltsbereich erstellen
Wenn Sie ein benutzerdefiniertes Layout benötigen, können Sie NotificationCompat.DecoratedCustomViewStyle
auf Ihre Benachrichtigung anwenden. Mit dieser API kannst du ein benutzerdefiniertes Layout für den Inhaltsbereich bereitstellen, der normalerweise von Titel und Textinhalt eingenommen wird, und weiterhin Systemelemente für das Benachrichtigungssymbol, den Zeitstempel, den Untertext und die Aktionsschaltflächen verwenden.
Diese API funktioniert ähnlich wie die Vorlagen für maximierbare Benachrichtigungen und baut auf dem grundlegenden Benachrichtigungslayout auf:
- Erstellen Sie eine grundlegende Benachrichtigung mit
NotificationCompat.Builder
. - Rufen Sie
setStyle()
auf und übergeben Sie eine Instanz vonNotificationCompat.DecoratedCustomViewStyle
. - Erweitern Sie Ihr benutzerdefiniertes Layout als Instanz von
RemoteViews
. - Rufen Sie
setCustomContentView()
auf, um das Layout für die minimierte Benachrichtigung festzulegen. - Sie können auch
setCustomBigContentView()
aufrufen, um ein anderes Layout für die erweiterte Benachrichtigung festzulegen.
Layouts vorbereiten
Sie benötigen ein small
- und large
-Layout. In diesem Beispiel könnte das small
-Layout so aussehen:
<?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>
Und das large
-Layout könnte so aussehen:
<?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>
Benachrichtigung erstellen und anzeigen
Sobald die Layouts fertig sind, können Sie sie wie im folgenden Beispiel gezeigt verwenden:
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);
Die Hintergrundfarbe der Benachrichtigung kann je nach Gerät und Version variieren. Wenden Sie Support Library-Stile wie TextAppearance_Compat_Notification
auf den Text und TextAppearance_Compat_Notification_Title
für den Titel in Ihrem benutzerdefinierten Layout an, wie im folgenden Beispiel gezeigt. Diese Stile passen sich an die Farbvariationen an, sodass Sie am Ende keinen Schwarz-auf-Schwarz- oder Weiß-auf-Weiß-Text haben.
<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" />
Legen Sie kein Hintergrundbild für das RemoteViews
-Objekt fest, da der Text dann möglicherweise nicht mehr lesbar wird.
Wenn Sie eine Benachrichtigung auslösen, während der Nutzer eine App verwendet, sieht das Ergebnis in etwa wie in Abbildung 1 aus:
Wenn du auf den Erweiterungspfeil tippst, wird die Benachrichtigung maximiert (siehe Abbildung 2):
Nachdem das Zeitlimit für die Benachrichtigung abgelaufen ist, wird die Benachrichtigung nur in der Systemleiste angezeigt, die wie in Abbildung 3 aussieht:
Wenn du auf den Erweiterungspfeil tippst, wird die Benachrichtigung maximiert (siehe Abbildung 4):
Vollständig benutzerdefiniertes Benachrichtigungslayout erstellen
Wenn Sie nicht möchten, dass Ihre Benachrichtigung mit dem Standardsymbol und dem Header für Benachrichtigungen versehen wird, führen Sie die vorherigen Schritte aus, rufen Sie jedoch nicht setStyle()
auf.