The Android Developer Challenge is back! Submit your idea before December 2.

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

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

通知に表示するコンテンツを増やすには、カスタム レイアウトではなく、展開可能な通知テンプレートのいずれかを使用することも検討してください。

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

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

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

この API を、次のように、基本的な通知レイアウトをベースとして作成した展開可能な通知テンプレートにも同様に適用できます。

  1. 基本的な通知NotificationCompat.Builder を使って作成します。
  2. setStyle() を呼び出して、NotificationCompat.DecoratedMediaCustomViewStyle のインスタンスを渡します。
  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 オブジェクト上に背景画像を設定しないでください。テキストの色が判読できなくなるおそれがあります。

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

標準の通知アイコンやヘッダーを自分の通知の装飾に使用したくない場合は、setCustomBigContentView() を使用します。setStyle() は呼び出さないでください。

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

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