カスタム通知レイアウトを作成する

さまざまな Android バージョンを横断して通知の表示を最適化するには、通知を作成する際、常に標準通知テンプレートを使用するようにします。ただし、このシステム テンプレートがニーズに合わない場合は、独自の通知レイアウトを設定できます。

通知に表示するコンテンツを増やしたい場合は、カスタム レイアウトを作成するのではなく、展開可能型通知テンプレートを使用することをおすすめします。

注: カスタム通知レイアウトを使用する場合は、そのカスタム レイアウトが、さまざまなデバイス方向や解像度に応じて適切に表示されるか、十分に注意して確認するようにしてください。この注意事項はすべての UI のレイアウトに当てはまりますが、通知ドロワー内はスペースが非常に限られるため、特に慎重に確認する必要があります。カスタム通知レイアウトで利用可能な高さは、通知ビューによって異なります。通常、折りたたみビューのレイアウトの場合は 64 dp が上限で、展開ビューのレイアウトの場合は 256 dp が上限になります。

コンテンツ領域用のカスタム レイアウトを作成する

カスタム レイアウトが必要な場合、NotificationCompat.DecoratedCustomViewStyle を通知に適用できます。この API を使用すると、通常はタイトルとテキスト コンテンツが占めるコンテンツ領域に対して、カスタム レイアウトを設定できます。一方、通知アイコンや、タイムスタンプ、サブテキスト、操作ボタンに関しては、システムの装飾をそのまま使用できます。

この API は、基本通知レイアウトをベースに作成した展開可能型通知テンプレートにも適用できます。手順は次のとおりです。

  1. NotificationCompat.Builder を使用して基本通知を作成します。
  2. setStyle() を呼び出して、NotificationCompat.DecoratedCustomViewStyle のインスタンスを渡します。
  3. カスタム レイアウトを RemoteViews のインスタンスとしてインフレートします。
  4. setCustomContentView() を呼び出して、折りたたみサイズ通知のレイアウトを設定します。

    必要に応じて、setCustomBigContentView() を呼び出して、展開サイズ通知のレイアウトも設定します。

たとえば、次のようになります。

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

通知の背景色は、デバイスやバージョンによって異なります。そのため、常にサポート ライブラリのスタイルを適用することをおすすめします。たとえば、カスタム レイアウト内のテキストには TextAppearance_Compat_Notification を適用し、タイトルには TextAppearance_Compat_Notification_Title を適用します。このようなスタイルはカラー バリエーションに合わせて自動調整されるため、黒色の背景の上に黒色のテキストが表示されたり、白色の背景の上に白色のテキストが表示されたりすることはありません。たとえば、次のようになります。

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

また、RemoteViews オブジェクト上に背景画像を設定しないようにしてください。テキストの色が判読できなくなるおそれがあります。

フルカスタム通知レイアウトを作成する

標準の通知アイコンやヘッダーを通知の装飾に使用したくない場合は、上記と同様の手順を進めて、setStyle() を呼び出す代わりに、setCustomBigContentView() を使用します。

Android 4.1(API レベル 16)よりも古い Android のバージョンをサポートするには、setContent() も呼び出して、同じ RemoteViews オブジェクトを渡す必要があります。

通知を使用する他のサンプルコードについては、Android 通知サンプルをご覧ください。