Tworzenie niestandardowego układu powiadomień

Aby powiadomienia wyglądały jak najlepiej w różnych wersjach Androida, użyj standardowego szablonu powiadomienia. Jeśli chcesz umieścić w powiadomieniu więcej treści, rozważ użycie jednego z rozwijanych szablonów powiadomień.

Jeśli jednak szablony systemowe nie spełniają Twoich potrzeb, możesz użyć własnego układu powiadomienia.

Tworzenie niestandardowego układu obszaru treści

Jeśli potrzebujesz niestandardowego układu, możesz zastosować NotificationCompat.DecoratedCustomViewStyle do powiadomienia. Ten interfejs API umożliwia udostępnienie niestandardowego układu obszaru treści, który zwykle jest zajmowany przez tytuł i tekst, przy jednoczesnym korzystaniu z dekoracji systemowych w przypadku ikony powiadomienia, sygnatury czasowej, tekstu dodatkowego i przycisków poleceń.

Ten interfejs API działa podobnie do rozwijanych szablonów powiadomień, ponieważ opiera się na podstawowym układzie powiadomienia w następujący sposób:

  1. Utwórz podstawowe powiadomienie za pomocą NotificationCompat.Builder.
  2. Wywołaj metodę setStyle(), przekazując jej instancję klasy NotificationCompat.DecoratedCustomViewStyle.
  3. Rozwiń niestandardowy układ jako instancję klasy RemoteViews.
  4. Wywołaj metodę setCustomContentView(), aby ustawić układ zwiniętego powiadomienia.
  5. Opcjonalnie możesz też wywołać metodę setCustomBigContentView(), aby ustawić inny układ rozwiniętego powiadomienia.

Przygotowywanie układów

Potrzebujesz układu small i large. W tym przykładzie układ small może wyglądać tak:

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

A układ large tak:

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

Tworzenie i wyświetlanie powiadomienia

Gdy układy będą gotowe, możesz ich użyć w sposób pokazany w tym przykładzie:

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)

Pamiętaj, że kolor tła powiadomienia może się różnić w zależności od urządzenia i wersji. W niestandardowym układzie zastosuj style biblioteki pomocy, takie jak TextAppearance_Compat_Notification w przypadku tekstu i TextAppearance_Compat_Notification_Title w przypadku tytułu, jak pokazano w tym przykładzie. Te style dostosowują się do zmian kolorów, dzięki czemu tekst nie będzie czarny na czarnym ani biały na białym.

<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" />

Unikaj ustawiania obrazu tła w obiekcie RemoteViews, ponieważ tekst może stać się nieczytelny.

Gdy wywołasz powiadomienie, gdy użytkownik korzysta z aplikacji, efekt będzie podobny do tego na ilustracji 1:

Zwinięty niestandardowy układ powiadomienia
Ilustracja 1. Podczas korzystania z innych aplikacji wyświetla się mały układ powiadomienia.

Gdy klikniesz strzałkę rozwijania, powiadomienie się rozwinie, jak pokazano na ilustracji 2:

Rozwinięty niestandardowy układ powiadomienia
Ilustracja 2. Podczas korzystania z innych aplikacji wyświetla się duży układ powiadomienia.

Gdy upłynie limit czasu powiadomienia, będzie ono widoczne tylko na pasku systemowym, który wygląda jak na ilustracji 3:

zwinięte powiadomienie na pasku systemowym,
Ilustracja 3. Jak mały układ powiadomienia wygląda na pasku systemowym.

Gdy klikniesz strzałkę rozwijania, powiadomienie się rozwinie, jak pokazano na ilustracji 4:

Rozwinięte powiadomienie na pasku systemowym
Ilustracja 4. Duży układ powiadomienia na pasku systemowym.

Tworzenie w pełni niestandardowego układu powiadomienia

Jeśli nie chcesz, aby powiadomienie było ozdobione standardową ikoną i nagłówkiem, wykonaj opisane powyżej czynności, ale nie wywołuj metody setStyle().