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:
- Crea una notifica di base con
NotificationCompat.Builder
. - Chiama
setStyle()
, passandogli un'istanza diNotificationCompat.DecoratedCustomViewStyle
. - Espandi il tuo layout personalizzato come istanza di
RemoteViews
. - Chiama
setCustomContentView()
per impostare il layout della notifica compressa. - 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:
Toccando la freccia di espansione, la notifica si espande, come mostrato nella figura 2:
Una volta scaduto il timeout, la notifica è visibile solo nella barra di sistema, simile alla figura 3:
Toccando la freccia di espansione, la notifica si espande, come mostrato nella figura 4:
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()
.