Benutzerdefiniertes Benachrichtigungslayout erstellen

Damit Ihre Benachrichtigungen auf verschiedenen Android-Versionen optimal aussehen, verwenden Sie die Standardvorlage für Benachrichtigungen. Wenn Sie mehr Inhalte in Ihre Benachrichtigung einfügen möchten, können Sie eine der erweiterbaren Vorlagen für Benachrichtigungen 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 können Sie ein benutzerdefiniertes Layout für den Inhaltsbereich bereitstellen, der normalerweise den Titel und den Textinhalt enthält. Dabei werden weiterhin Systemdekorationen für das Benachrichtigungssymbol, den Zeitstempel, den Untertitel und die Aktionsschaltflächen verwendet.

Diese API funktioniert ähnlich wie die erweiterbaren Vorlagen für Benachrichtigungen, indem sie auf dem grundlegenden Layout für Benachrichtigungen basiert:

  1. Erstellen Sie eine einfache Benachrichtigung mit NotificationCompat.Builder.
  2. Rufen Sie setStyle() auf und übergeben Sie eine Instanz von NotificationCompat.DecoratedCustomViewStyle.
  3. Erstellen Sie Ihr benutzerdefiniertes Layout als Instanz von RemoteViews.
  4. Rufen Sie setCustomContentView() auf, um das Layout für die minimierte Benachrichtigung festzulegen.
  5. Optional können Sie auch setCustomBigContentView() aufrufen, um ein anderes Layout für die erweiterte Benachrichtigung festzulegen.

Layouts vorbereiten

Sie benötigen ein small- und ein large-Layout. In diesem Beispiel könnte das small-Layout so aussehen:

<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 so:

<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

Nachdem die Layouts fertig sind, können Sie sie wie im folgenden Beispiel verwenden:

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)

Die Hintergrundfarbe für die Benachrichtigung kann je nach Gerät und Version variieren. Wenden Sie in Ihrem benutzerdefinierten Layout Stile der Support Library wie TextAppearance_Compat_Notification für den Text und TextAppearance_Compat_Notification_Title für den Titel an, wie im folgenden Beispiel gezeigt. Diese Stile passen sich an die Farbvariationen an, sodass Sie keinen schwarzen Text auf schwarzem Hintergrund oder weißen Text auf weißem Hintergrund erhalten.

<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 Ihr RemoteViews-Objekt fest, da der Text sonst möglicherweise nicht lesbar ist.

Wenn Sie eine Benachrichtigung auslösen, während der Nutzer eine App verwendet, sieht das Ergebnis ähnlich wie in Abbildung 1 aus:

Ein minimiertes Layout für benutzerdefinierte Benachrichtigungen
Abbildung 1. Ein kleines Layout für Benachrichtigungen wird angezeigt während andere Apps verwendet werden.

Wenn Sie auf den Pfeil zum Erweitern tippen, wird die Benachrichtigung erweitert, wie in Abbildung 2 gezeigt:

Ein maximiertes Layout für benutzerdefinierte Benachrichtigungen
Abbildung 2. Ein großes Layout für Benachrichtigungen wird angezeigt während andere Apps verwendet werden.

Nach Ablauf des Benachrichtigungs-Timeouts ist die Benachrichtigung nur noch in der Systemleiste sichtbar, wie in Abbildung 3 dargestellt:

Eine minimierte Benachrichtigung in der Systemleiste
Abbildung 3. So sieht das kleine Layout für Benachrichtigungen in der Systemleiste aus.

Wenn Sie auf den Pfeil zum Erweitern tippen, wird die Benachrichtigung erweitert, wie in Abbildung 4 gezeigt:

Eine maximierte Benachrichtigung in der Systemleiste
Abbildung 4. Ein großes Layout für Benachrichtigungen wird in der Systemleiste angezeigt.

Vollständig benutzerdefiniertes Layout für Benachrichtigungen erstellen

Wenn Sie nicht möchten, dass Ihre Benachrichtigung mit dem Standardsymbol und der Standardüberschrift für Benachrichtigungen versehen wird, folgen Sie der Anleitung oben, rufen Sie aber nicht setStyle() auf.