Criar um layout de notificação personalizado

Para garantir que sua notificação tenha a melhor aparência em diferentes versões do Android, use sempre o modelo de notificação padrão. No entanto, se os modelos do sistema não atenderem às suas necessidades, você poderá oferecer o próprio layout de notificação.

Se você quiser disponibilizar mais conteúdo na notificação, use também um dos modelos de notificação expansíveis em vez de criar um layout personalizado.

Cuidado: ao usar um layout personalizado de notificação, certifique-se de que ele funcione com diferentes orientações e resoluções do dispositivo. Embora esse aviso seja válido para todos os layouts de IU, ele é especialmente importante para as notificações, porque o espaço na gaveta correspondente é muito restrito. A altura disponível para um layout de notificação personalizado depende da visualização da notificação. Geralmente, os layouts de visualização recolhida são limitados a 64 dp, e os layouts de visualização expandida são limitados a 256 dp.

Criar layout personalizado para a área de conteúdo

Se você precisar de um layout personalizado, aplique NotificationCompat.DecoratedCustomViewStyle à sua notificação. Essa API permite oferecer um layout personalizado para a área de conteúdo normalmente ocupada pelo título e pelo conteúdo do texto, sem deixar de usar decorações do sistema para o ícone de notificação, carimbo de data/hora, subtexto e botões de ação.

Essa API funciona de maneira semelhante aos modelos de notificação expansíveis baseando-se no layout básico de notificação, da seguinte maneira:

  1. Crie uma notificação básica com NotificationCompat.Builder.
  2. Chame setStyle(), transmitindo uma instância de NotificationCompat.DecoratedCustomViewStyle.
  3. Infle o layout personalizado como uma instância de RemoteViews.
  4. Chame setCustomContentView() para definir o layout da notificação recolhida.

    Opcionalmente, chame setCustomBigContentView() para definir um layout diferente para a notificação expandida.

Exemplo:

Kotlin

    // 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()
    

Java

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

Lembre-se de que a cor de plano de fundo da notificação pode variar de acordo com o dispositivo e a versão. Portanto, aplique sempre estilos de Biblioteca de Suporte como TextAppearance_Compat_Notification para o texto e TextAppearance_Compat_Notification_Title para o título em seu layout personalizado. Esses estilos se adaptam às variações de cor, para que você não tenha texto preto sobre preto ou branco sobre branco. Exemplo:

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

Além disso, evite definir uma imagem de plano de fundo no objeto RemoteViews, porque a cor do texto pode ficar ilegível.

Criar um layout de notificação totalmente personalizado

Se você não quiser que sua notificação seja decorada com o ícone e o cabeçalho de notificação padrão, siga as etapas acima para usar setCustomBigContentView(), mas não chame setStyle().

Para oferecer compatibilidade a versões mais antigas do Android 4.1 (API de nível 16), chame também setContent(), passando a ele o mesmo objeto RemoteViews.

Para ver mais exemplos de códigos que usam notificações, consulte o Exemplo de notificações do Android (em inglês).