Creare un layout di notifica personalizzato

Per un aspetto ottimale delle notifiche nelle diverse versioni di Android, usa il modello di notifica standard per creare le tue notifiche. Se vuoi fornire più contenuti nella notifica, puoi utilizzare uno dei modelli di notifica espandibili.

Tuttavia, se i modelli di sistema non soddisfano le tue esigenze, puoi utilizzare un layout personalizzato per le notifiche.

Crea un layout personalizzato per l'area dei contenuti

Se hai bisogno di un layout personalizzato, puoi applicare NotificationCompat.DecoratedCustomViewStyle alla notifica. Questa API ti consente di fornire un layout personalizzato per l'area dei contenuti normalmente occupata dal titolo e dal testo, pur continuando a utilizzare le decorazioni di sistema per l'icona di notifica, il timestamp, il sottotitolo e i pulsanti di azione.

Questa API funziona in modo simile ai modelli di notifica espandibili basandosi sul layout di notifica di base come segue:

  1. Crea una notifica di base con NotificationCompat.Builder.
  2. Chiama setStyle(), passandogli un'istanza di NotificationCompat.DecoratedCustomViewStyle.
  3. Espandi il tuo layout personalizzato come istanza di RemoteViews.
  4. Chiama setCustomContentView() per impostare il layout della notifica compressa.
  5. Se vuoi, chiama anche setCustomBigContentView() per impostare un layout diverso per la notifica espansa.

Prepara i layout

Devi avere un layout small e large. Per questo esempio, il layout small potrebbe avere il seguente aspetto:

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

E il layout large potrebbe avere il seguente aspetto:

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

Crea e mostra la notifica

Quando i layout sono pronti, puoi utilizzarli come mostrato nell'esempio seguente:

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

Tieni presente che il colore di sfondo della notifica può variare in base al dispositivo e alla versione. Applica gli stili della Raccolta di supporto come TextAppearance_Compat_Notification per il testo e TextAppearance_Compat_Notification_Title per il titolo nel layout personalizzato, come mostrato nell'esempio seguente. Questi stili si adattano alle variazioni di colore così da non creare testo in bianco su nero o bianco su bianco.

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

Evita di impostare un'immagine di sfondo nell'oggetto RemoteViews, perché il testo potrebbe diventare illeggibile.

Quando attivi una notifica mentre l'utente utilizza un'app, il risultato è simile alla figura 1:

Un&#39;immagine che mostra una notifica compressa
Figura 1. Durante l'utilizzo di altre app viene visualizzato un piccolo layout di notifica.

Toccando la freccia di espansione, la notifica si espande, come mostrato nella figura 2:

Un&#39;immagine che mostra una notifica espansa nella barra di sistema
Figura 2. Durante l'utilizzo di altre app viene visualizzato un layout di notifica di grandi dimensioni.

Una volta scaduto il timeout, la notifica è visibile solo nella barra di sistema, simile alla figura 3:

Un&#39;immagine che mostra una notifica compressa nella barra di sistema
Figura 3. Il modo in cui il piccolo layout delle notifiche viene visualizzato nella barra di sistema.

Toccando la freccia di espansione, la notifica si espande, come mostrato nella figura 4:

Un&#39;immagine che mostra una notifica espansa nella barra di sistema
Figura 4. Nella barra di sistema viene visualizzato un layout di notifica di grandi dimensioni.

Crea un layout di notifica completamente personalizzato

Se non vuoi che la notifica venga decorata con l'icona e l'intestazione di notifica standard, segui i passaggi precedenti, ma non chiamare setStyle().