web-dev-qa-db-ja.com

NotificationCompat 4.1 SetSmallIconおよびSetLargeIcon

このシンプルなコードを使用して、通知をAndroid 4.1以上に設定しました。うまく動作しますが、SmallIconとLargeIconに問題があります。SmallIconはステータスバーとLargeIconに表示されることを理解していますドロップダウンリストに表示されます。

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setTicker("The ticker");
builder.setContentTitle("The title");
builder.setContentText("The text");
builder.setSmallIcon(R.drawable.my_small_icon);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.my_96px_large_icon);
builder.setLargeIcon(bm);       
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm.notify("direct_tag", NOTIF_ALERTA_ID, builder.build());

私の問題は:

  1. 通知が起動されると、元のSmallIconをサイズ変更せずに表示するのではなく、「The Ticker」テキストの横にトリミングされたサイズの小さいアイコンが表示されます。 enter image description here

  2. ドロップダウンリストの左側にLargeIconが表示されています。しかし、右側の通知の時間の横にも小さなアイコンが表示されます。私はそれを見せたくありません。 enter image description here

36
Ton
  1. 私のアプリケーションでは、大きいアイコン(128x128 px)を小さいアイコンとして描画できますが、拡大縮小された状態でトリミングなしで表示されます。あなたのドロウアブルはビットマップファイルで定義されていますか、それともXMLリソースとして定義されていますか? XMLでは、表示のいくつかの側面(トリミングなど)を指定できます。 XMLを再確認するか、PNG/JPGのみを使用してください。

  2. Notification.setSmallIcon()のAndroid APIドキュメント は次のように明確に述べています:

    ステータスバーで通知を表すために使用される小さなアイコンリソースを設定します。展開されたビューのプラットフォームテンプレートは、大きなアイコンも指定されていない限り、このアイコンを左側に描画します。この場合、小さなアイコンは右側に移動されます

知る限り、独自の通知テンプレートを提供しない限り、動作をオーバーライドする方法はありません( Notification.setContent()

29
Jerzyna

この奇妙な実装を回避する方法があります。 setLargeIconを使用する代わりに、これを使用します。

Notification notification=notificationBuilder.build()
notification.contentView.setImageViewResource(Android.R.id.icon, R.drawable.your_large_icon);
15
Thunder

これは予想される動作だと思います。

小さなアイコンがアイコンサイズのUXガイドラインに従っていることを確認する必要があります。小さなアイコンは24x24dpに制限されています。

拡張通知のデフォルトの動作では、大きなアイコンと小さなアイコンの両方が表示されます。小さなアイコンを取り除く方法があるかどうかはわかりませんが、なぜこれが重要なのですか?

9
Joe Malin

私の場合、赤いアイコンを大きなアイコンに設定し、setColorをColor.WHITEに設定し、白いアイコンを小さなアイコンに設定しました。そうすると、通知領域に赤いアイコンが表示され、白いアイコンが「消えます」。

Bitmap icon = BitmapFactory.decodeResource(getResources(),R.drawable.app_logo);

mBuilder.setContentIntent(resultPendingIntent).setColor(Color.WHITE).setLargeIcon(icon);
1
Hanoch Moreno