Benutzerdefiniertes Benachrichtigungslayout erstellen

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:

  1. Erstellen Sie eine grundlegende Benachrichtigung mit NotificationCompat.Builder.
  2. Rufen Sie setStyle() auf und übergeben Sie eine Instanz von NotificationCompat.DecoratedCustomViewStyle.
  3. Erweitern Sie Ihr benutzerdefiniertes Layout als Instanz von RemoteViews.
  4. Rufen Sie setCustomContentView() auf, um das Layout für die minimierte Benachrichtigung festzulegen.
  5. 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:

Ein Bild mit einer minimierten Benachrichtigung
Abbildung 1: Wenn du andere Apps verwendest, wird ein kleines Benachrichtigungslayout angezeigt.

Wenn du auf den Erweiterungspfeil tippst, wird die Benachrichtigung maximiert (siehe Abbildung 2):

Ein Bild mit einer erweiterten Benachrichtigung in der Systemleiste
Abbildung 2. Wenn Sie andere Apps verwenden, wird ein großes Benachrichtigungslayout angezeigt.

Nachdem das Zeitlimit für die Benachrichtigung abgelaufen ist, wird die Benachrichtigung nur in der Systemleiste angezeigt, die wie in Abbildung 3 aussieht:

Ein Bild mit einer minimierten Benachrichtigung in der Systemleiste
Abbildung 3: So wird das kleine Benachrichtigungslayout in der Systemleiste angezeigt.

Wenn du auf den Erweiterungspfeil tippst, wird die Benachrichtigung maximiert (siehe Abbildung 4):

Ein Bild mit einer erweiterten Benachrichtigung in der Systemleiste
Abbildung 4: In der Systemleiste wird ein großes Benachrichtigungslayout angezeigt.

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.