android 5.0以上通知欄、狀態欄圖標變成白色


在5.0以上的系統上發現,平常的自定義notification出來的icon,居然在狀態欄上變成了純白色的icon。

看源代碼會發現:

 1 protected void applyColorsAndBackgrounds(StatusBarNotification sbn,
 2             NotificationData.Entry entry) {
 3 
 4         if (entry.expanded.getId() != com.android.internal.R.id.status_bar_latest_event_content) {
 5             // Using custom RemoteViews
 6             if (entry.targetSdk >= Build.VERSION_CODES.GINGERBREAD
 7                     && entry.targetSdk < Build.VERSION_CODES.LOLLIPOP) {
 8                 entry.row.setShowingLegacyBackground(true);
 9                 entry.legacy = true;
10             }
11         } else {
12             // Using platform templates
13             final int color = sbn.getNotification().color;
14             if (isMediaNotification(entry)) {
15                 entry.row.setTintColor(color == Notification.COLOR_DEFAULT
16                         ? mContext.getResources().getColor(
17                                 R.color.notification_material_background_media_default_color)
18                         : color);
19             }
20         }
21 
22         if (entry.icon != null) {
23             if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
24                 entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
25             } else {
26                 entry.icon.setColorFilter(null);
27             }
28         }
29     }

github:

 
因為google在android5.0上面做了限制,為了統一系統風格。之后的狀態欄icon就不能夠隨便用一張色彩豐富的圖片了,只能夠有白色和透明兩個顏色出現。
5.0以上(不包含5.0),系統默認通知欄圖標為系統啟動圖標,會自動將通知欄的圖標(有色區域)全部填充為白色,
像一個白色格子,這是Google 為了實現材料設計規范,特意為之。為了去除白色圖標,鏤空背景即可:
所以這之后的想要設置顯示狀態欄icon不為白色: 這個icon只要背景需要透明,只讓內容塊純白色。
另類的解決辦法:(不推薦)
可以通過降低targetSdkVersion的方法,來達到顯示彩色icon,但是不支持降低targetSdkVersion的方法。
(就是把AndroidManifest.xml uses-sdk節點的targetSdkVersion屬性設置為21以下(不含21))
 
但是為了兼容5.0以下還正常使用:
我們判斷下就可以分別設置 setSmallIcon
1 // 5.0
2         if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
3             notificationBuilder.setSmallIcon(R.drawable.ic_aphla_logo);
4         } else {
5             notificationBuilder.setSmallIcon(R.drawable.ic_logo);
6         }

setLargeIcon 正常使用,不需要特別處理。使用舊的icon圖片即可。

因為smallicon已經是透明,或者白色了,這時可以設置:
notificationBuilder.setColor();

然后就有背景顏色在通知欄上了。

介紹:

Android通知欄微技巧,那些你所沒關注過的小細節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM