Creare un layout di notifica personalizzato

Per migliorare l'aspetto delle notifiche su diverse versioni di Android, usa le notifiche standard modello per creare notifiche. Se vuoi fornire altri contenuti nella notifica, prendi in considerazione l'utilizzo di una delle notifiche espandibili modelli.

Tuttavia, se i modelli di sistema non soddisfano le tue esigenze, puoi utilizzare modelli layout per la notifica.

Crea un layout personalizzato per l'area dei contenuti

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

Questa API funziona in modo simile ai modelli di notifiche espandibili basandosi sulla notifica di base layout del video come segue:

  1. Crea una notifica di base con NotificationCompat.Builder
  2. Chiama setStyle(), passando un'istanza NotificationCompat.DecoratedCustomViewStyle.
  3. Aumenta il 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.
di Gemini Advanced.

Prepara i layout

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

Il layout large potrebbe essere simile al seguente:

<?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 per la notifica può variare da un dispositivo all'altro e versioni successive. Applicare gli stili della Libreria di assistenza, ad esempio TextAppearance_Compat_Notification per il testo e TextAppearance_Compat_Notification_Title per il titolo nel tuo layout personalizzato, come mostrato nell'esempio seguente. Questi stili si adattano alle variazioni di colore in modo che non ci sarà testo nero 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 sull'oggetto RemoteViews, perché il testo potrebbero diventare illeggibili.

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

Un&#39;immagine che mostra una notifica compressa
. Figura 1. Viene visualizzato un piccolo layout per le notifiche mentre usi altre app.

Se tocchi 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. Viene visualizzato un layout di notifica grande mentre usi altre app.

Una volta terminato il timeout, la notifica è visibile solo nei barra di sistema, che è simile alla figura 3:

Un&#39;immagine che mostra una notifica compressa nella barra di sistema
. Figura 3. Layout delle notifiche piccole nella barra di sistema.

Se tocchi 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. Un layout di notifica di grandi dimensioni appare in nella barra di sistema.

Crea un layout di notifica completamente personalizzato

.

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