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:
- Crie uma notificação básica com
NotificationCompat.Builder
. - Chame
setStyle()
, transmitindo uma instância deNotificationCompat.DecoratedCustomViewStyle
. - Infle o layout personalizado como uma instância de
RemoteViews
. 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).