NotificationCompat 4.1中SetSmallIcon和SetLargeIcon的含义是什么?

39

我使用这段简单代码在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. 当通知被启动时,“The Ticker”文本旁边显示一个裁剪过的过大的小图标,而不是显示原始的小图标而无需将其裁剪。 enter image description here

  2. 在下拉列表中,我看到左侧有大图标,这很好。但是我也看到了右侧的小图标,它位于通知时间的旁边。我不想显示那个。 enter image description here


我在解决这个问题方面遇到了困难,你能否帮我澄清需要什么?被接受的答案并没有完全告诉我该怎么做。 - Andrew Bullock
@AndrewBullock - builder.setSmallIcon(0); 对你有用吗?当使用大图标时,它应该禁用小图标。 - tomash
为什么不直接设置一个全透明的图像文件呢? - Moisés Alexander Salazar Vila
5个回答

30
  1. 我的应用程序提供了一个大的(128x128像素)PNG可绘制小图标,它会显示为缩放并且没有裁剪。你的drawable是作为位图文件还是XML资源定义的?在XML中,你可以指定显示的几个方面(例如裁剪)。请仔细检查你的XML或者只使用PNG/JPG。

  2. 正如Android API文档关于Notification.setSmallIcon()所清楚陈述:

    设置小图标资源,它将用于表示状态栏中的通知。在扩展视图的平台模板中,该图标将在左侧绘制,除非也已指定了大图标,在这种情况下,小图标将移动到右侧。

据我所知,除非你提供自己的通知模板(通过Notification.setContent()),否则没有办法覆盖此行为。


14

有一种方法可以规避这种奇怪的实现。不要使用setLargeIcon,而是用以下方式:

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

不错的技巧。它绕过了小图标和大图标交互的机制,只是在通知构建后修改了imageview。 - GregD
已弃用。但显然你可以使用NotificationCompat.Builder.setCustomContentView(RemoteViews)代替。 - Swindler

8
我猜测这是预期的行为。您应该检查您的小图标是否遵循图标大小的UX指南。小图标限制为24x24dp。
扩展通知的默认行为是同时显示大图标和小图标。我不确定是否有方法可以摆脱小图标,但这为什么很重要呢?

1
这很重要,因为我的应用程序是唯一一个在时间旁边显示小图标的应用程序。 - Ton
我通过在我的应用程序中使用与一直使用的大图标,并将我的小图标缩小到24x24dp(例如24x24像素)来解决了这个问题。非常感谢您提供的这个尺寸提示,因为我在其他地方都没有看到过。 - user1499731
1
用户体验指南在哪里? - Ruchir Baronia
UX指南 https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar.html - Ego Slayer

1
在我的情况下,我只是将我的红色图标设置为大图标,并将setColor设置为Color.WHITE,然后将白色图标设置为我的小图标。这样,在通知区域,我的红色图标显示出来,而白色图标则“消失了”。
Bitmap icon = BitmapFactory.decodeResource(getResources(),R.drawable.app_logo);

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

-1
在我的情况下,我没有在所有文件夹(xhdpi、hdpi、mdpi、ldpi)中放置图标图像。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接