To make your notifications look their best across different versions of Android, use the standard notification template to build your notifications. If you want to provide more content in your notification, consider using one of the expandable notification templates.
However, if the system templates don't meet your needs, you can use your own layout for the notification.
Create custom layout for the content area
If you need a custom layout, you can apply NotificationCompat.DecoratedCustomViewStyle
to your notification. This API lets you provide a custom layout for the content area normally occupied by the title and text content, while still using system decorations for the notification icon, timestamp, sub-text, and action buttons.
This API works similarly to the expandable notification templates by building on the basic notification layout as follows:
- Build a basic notification with
NotificationCompat.Builder
. - Call
setStyle()
, passing it an instance ofNotificationCompat.DecoratedCustomViewStyle
. - Inflate your custom layout as an instance of
RemoteViews
. - Call
setCustomContentView()
to set the layout for the collapsed notification. - Optionally, also call
setCustomBigContentView()
to set a different layout for the expanded notification.
Prepare the layouts
You need a small
and large
layout. For this example, the small
layout might look like this:
<?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>
And the large
layout might look like this:
<?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>
Build and show the notification
After the layouts are ready, you can use them as shown in the following example:
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);
Be aware that the background color for the notification can vary across devices and versions. Apply Support Library styles such as TextAppearance_Compat_Notification
for the text and TextAppearance_Compat_Notification_Title
for the title in your custom layout, as shown in the following example. These styles adapt to the color variations so you don't end up with black-on-black or white-on-white text.
<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" />
Avoid setting a background image on your RemoteViews
object, because your text might become unreadable.
When you trigger a notification while the user is using an app, the result is similar to figure 1:

Tapping the expander arrow expands the notification, as shown in figure 2:

After the notification timeout runs out, the notification is visible only in the system bar, which looks like figure 3:

Tapping the expander arrow expands the notification, as shown in figure 4:

Create a fully custom notification layout
If you don't want your notification decorated with the standard notification icon and header, follow the preceding steps but don't call setStyle()
.