I wanted to create a Notification including some controls. Since text and controls are small with default notification size (64dp), i wanted have it larger than default size.
It is possible to create larger notifications, and I think it is possible to have a custom layout, too, but I don't know how.
To be more specific, the following screenshot shows the notification from spotify (image take from here):
As you can see, the size is bigger than default. Further, it has some kind of ImageButtons without text - if you use Notification.Builder.addAction(), you may provide an icon but also need to provide a CharSequence as a description - if you leave the description empty, there will still be space reserved for the text and if you pass null, it will crash.
Can anybody tell me how to create a big notification with a custom layout?
Update due to API changes:
From API 24 on, the
Notification.Builder contains a setCustomBigContentView(RemoteViews)-method. Also the NotificationCompat.Builder (which is part of the support.v4 package) contains this method.
Please note, that the documentation for the NotificationCompat.Builder.setCustomBigContentView states:
Supply custom RemoteViews to use instead of the platform template in the expanded form. This will override the expanded layout that would otherwise be constructed by this Builder object. No-op on versions prior to JELLY_BEAN.
Therefore, this will also only work for API >= 16 (JELLY_BEAN).
So after excessive google usage, I found this tutorial explaining how to use custom big layouts. The trick is not to use
setStyle() but manually set the
bigContentView field of the
Notification after building it. Seems a bit hacky, but this is what I finally came up with:
<?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="100dp" <!-- This is where I manually define the height --> android:orientation="horizontal" > <!-- some more elements.. --> </LinearLayout>
Notification in code:
Notification foregroundNote; RemoteViews bigView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_layout_big); // bigView.setOnClickPendingIntent() etc.. Notification.Builder mNotifyBuilder = new Notification.Builder(this); foregroundNote = mNotifyBuilder.setContentTitle("some string") .setContentText("Slide down on note to expand") .setSmallIcon(R.drawable.ic_stat_notify_white) .setLargeIcon(bigIcon) .build(); foregroundNote.bigContentView = bigView; // now show notification.. NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotifyManager.notify(1, foregroundNote);
As noted by chx101, this only works for API >= 16. I did not mention it in this answer, yet it was mentioned in the given linked tutorial above:
Expanded notifications were first introduced in Android 4.1 JellyBean [API 16].