为什么在Android Lollipop中使用Notification.Builder.setSmallIcon设置的图标显示为白色正方形?

67

我有这段代码:

Notification notif;

// Build notification
Notification.Builder notifBuilder = new Notification.Builder(context);
notifBuilder.setContentIntent(pendingIntent);
notifBuilder.setContentTitle(title);
notifBuilder.setSmallIcon(icon_resId);
notifBuilder.setContentText(ne.getCaption());
notifBuilder.setDefaults(Notification.DEFAULT_ALL);
notifBuilder.setAutoCancel(autocancel);
notifBuilder.setWhen(System.currentTimeMillis());
notif = notifBuilder.build();

在Android 4.4中运行良好。

然而,在Android 5.0中,状态栏中显示的图标是一个白色正方形。当设备锁定时出现的新“通知主体”中显示的图标是正确的。

http://developer.android.com/reference/android/app/Notification.Builder.html中,我没有看到关于API Level 21中通知图标的任何新信息。


你好,你找到解决方案了吗?我这里也遇到了同样的问题。 我尝试使用另一个图标,但仍然出现相同的问题。 - Seb83
2
我已经解决了将图标大小更改为16x16像素并只使用白色的问题。 - Borja
2
可能是重复的问题:通知栏图标在 Android 5 Lollipop 中变成白色 - Ciro Santilli OurBigBook.com
还有其他人在寻找解决方案吗?https://dev59.com/wl4c5IYBdhLWcg3wCGf2#39142981 - Muhammad Babar
8个回答

33

5
文档已更改: https://www.google.com/design/spec/patterns/notifications.html“使用不透明的白色,仅使用 alpha 通道。” - Ben
4
Porlicus或Ben的链接目前都没有提到有关小图标规格的任何信息。 - JoeMjr2
这里提供一个存档版本,可在此处查看:http://web.archive.org/web/20150209195038/http://developer.android.com/design/style/iconography.html#notification - caw

32

我已经解决了将图标大小更改为16x16像素,并仅使用白色。


3
你有没有注意到在棒棒糖系统里所有通知图标都被遮盖成白色?因此,在棒棒糖系统中使用好的图标,你应该选择一个具有明显形状的图标。所有颜色都将转换为白色,因此透明度是必须的。 - Dion Segijn
图像的完整资产大小应为7272,光学正方形为6666,以便正确显示。请参考http://petrnohejl.github.io/Android-Cheatsheet-For-Graphic-Designers/。 - SavageKing
@SavageKing 这是一个很好的资源,但它没有更新到Lollipop版本。特别是,通知图标大小与谷歌应用程序不再正确比例缩放。据我所知,他们在xxxhdpi中使用80x80的图标,放在96x96的图像中。 - Sterling
你的意思是只使用白色吗?那么你的小图标只是一个白色的正方形吗? - Boris Gafurov

4

如Android开发者网站中关于通知的Android 5.0行为变更所述:

通知使用深色文字绘制在白色(或非常浅的)背景上,以配合新材料设计小部件。确保您的所有通知都符合新的颜色方案。如果您的通知看起来有问题,请进行以下操作:

使用setColor()在您的图标图像后面设置一个强调色圆形。 更新或删除与颜色有关的资源。系统忽略操作图标和主通知图标中的非α通道。您应该假设这些图标仅为α通道。系统以白色绘制通知图标,并以深灰色绘制操作图标。

http://developer.android.com/about/versions/android-5.0-changes.html.


4

重复问题:Android 5 Lollipop中通知栏图标变为白色

简述:

Android 5更新:https://developer.android.com/about/versions/android-5.0-changes.html通知->材料设计风格

更新或删除涉及颜色的资源。系统忽略操作图标和主要通知图标中的所有非Alpha通道。您应该假设这些图标仅为Alpha。系统以白色绘制通知图标,以深灰色绘制操作图标。

可以使用以下方式设置小图标的背景颜色(默认为灰色):

Notification.Builder#setColor(int)

3
在你的清单文件中添加以下内容 -
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_notification" />

2
如果您还在寻找解决方法,最简单的方法是先使用Android图标工作室渲染图标,链接如下:https://romannurik.github.io/AndroidAssetStudio/icons-notification.html,将下载的zip文件解压到您的项目/main文件夹中,使其适应相关的drawable-xxxx文件夹。然后,要在通知中更改颜色,请使用以下代码:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_notification_appicon) // <-- Icon from Android Icon Studio 
    .setColor(context.getColor(R.color.holo_blue))    // <-- Set your preferred icon colour to appear in the notification dropdown list
    .setContentTitle("Title")
    .setContentText("Content")
    .setAutoCancel(true)
    .setCategory(NotificationCompat.CATEGORY_EVENT)
    .setDefaults(Notification.DEFAULT_ALL)
    .setPriority(NotificationCompat.PRIORITY_DEFAULT);

0

-3
manifest.xml中删除android:targetSdkVersion="21",它就可以工作了!

76
这不是解决方法,而是对抗体制的一种糟糕方式。 - SagiLow
在清单文件中使用 android:targetSdkVersion="21" 版本时,是否有任何解决方案? - John
3
@john,不过将android:targetSdkVersion="19"设置也同样有效。对于其他人:我不太明白为什么会有人不喜欢这个答案。问题基本上是“Lollipop不想按照我想要的方式做事情”。因此,逻辑上你的选择是接受Lollipop的方式或者不针对Lollipop进行开发。 - netsplit
2
为什么manifest.xml中要设置targetSdkVersion?这些应该在build.gradle中设置。 - IgorGanapolsky
这个解决方案行不通。即使在SDK版本21或更高版本中也无法停止通知。 - Mohsin
非常懒惰的解决方案!它并没有真正解决任何问题。这就像让我们用胶带修补一个破损的建筑支柱,并认为问题已经解决了一样。你不能建议将项目的目标SDK版本降级,因为一些利益相关者想要针对最新的Android设备进行开发。例如,OEM的内置应用程序。 - Neon Warge

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