国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android不使用自定義布局情況下實現自定義通知欄圖標的方法

2020-04-11 11:10:25
字體:
來源:轉載
供稿:網友

本文實例講述了Android不使用自定義布局情況下實現自定義通知欄圖標的方法。分享給大家供大家參考,具體如下:

自定義通知欄圖標?不是很簡單么。自定義布局都不在話下!

是的,有xml布局文件當然一切都很簡單,如果不給你布局文件用呢?

聽我慢慢道來!

首先怎么創建一個通知呢?
1.new 一個

復制代碼 代碼如下:
Notification n = new Notification(android.R.drawable.ic_menu_share, null, System.currentTimeMillis());

參數:圖標 ID,發送到狀態欄瞬間的文字,當前時間

2.設置詳細信息:標題、內容、intent

PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);n.setLatestEventInfo(this, "早上好!", "今天是個晴朗的天氣!", contentIntent);

3.發送到通知欄

NotificationManager mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mNM.notify(1001, n);

這樣就完成了一個通知的展示,很簡單!

我們來看看 n.setLatestEventInfo 干了些什么呢

public void setLatestEventInfo(Context context,   CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) { // TODO: rewrite this to use Builder RemoteViews contentView = new RemoteViews(context.getPackageName(),    R.layout.notification_template_base); if (this.icon != 0) {  contentView.setImageViewResource(R.id.icon, this.icon); } if (priority < PRIORITY_LOW) {  contentView.setInt(R.id.icon,     "setBackgroundResource", R.drawable.notification_template_icon_low_bg);  contentView.setInt(R.id.status_bar_latest_event_content,     "setBackgroundResource", R.drawable.notification_bg_low); } if (contentTitle != null) {  contentView.setTextViewText(R.id.title, contentTitle); } if (contentText != null) {  contentView.setTextViewText(R.id.text, contentText); } if (this.when != 0) {  contentView.setViewVisibility(R.id.time, View.VISIBLE);  contentView.setLong(R.id.time, "setTime", when); } if (this.number != 0) {  NumberFormat f = NumberFormat.getIntegerInstance();  contentView.setTextViewText(R.id.info, f.format(this.number)); } this.contentView = contentView; this.contentIntent = contentIntent;}

可以看到,他實際上就是使用系統默認布局為我們創建了一個 RemoteViews ,RemoteViews 是專門用來跨進程顯示的 View ,詳情參考官方文檔:http://developer.android.com/intl/zh-cn/reference/android/widget/RemoteViews.html

看這句:

復制代碼 代碼如下:
contentView.setImageViewResource(R.id.icon, this.icon);

其實就是設置圖標了:

參數1:用來顯示圖標的 ImageView 的 id
參數2:圖標 id

但是還有一個這樣的方法:

復制代碼 代碼如下:
RemoteViews.setImageViewBitmap(int viewId, Bitmap bitmap)

用 Bitmap 來設置圖標。

而 Notifycation 里面有個參數:Notification.contentView,仔細看,setLastestEventInfo 方法里創建的 RemoteViews 就是他,所以你知道該怎么做了!

但是這里還有一個問題?R.id.icon 怎么獲取,這個東西其實在 com.android.internal.R 這個里面,但是這個類我們訪問不到怎么辦?

反射唄, Java 的反射可謂是萬能啊,啥都可以拿到只要他在。

Class<?> clazz = Class.forName("com.android.internal.R$id");  Field field = clazz.getField("icon");  field.setAccessible(true);  int id_icon = field.getInt(null); 
n.setLatestEventInfo(context, title, msg, contentIntent);n.flags |= Notification.FLAG_AUTO_CANCEL;if(n.contentView != null && icon != null){ n.contentView.setImageViewBitmap(id_icon, icon);}

發出通知,下拉通知欄看看,圖標是不是變了^_^

此外這里還有一個小細節,就是你 new Notifycation() 是傳進去的圖標會作為狀態欄的小圖標,小圖標尺寸在 hdpi 下面放 32x32 的就可以

所以你可以第一次傳小圖標,然后通過 contentView 設置大圖標,這樣就OK了

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武定县| 东海县| 时尚| 南充市| 乐至县| 永和县| 宁河县| 保康县| 囊谦县| 门源| 股票| 綦江县| 新龙县| 儋州市| 兴业县| 咸丰县| 神池县| 青海省| 高清| 阳东县| 洪雅县| 沁源县| 东源县| 扶绥县| 平乡县| 溆浦县| 蒲江县| 庆城县| 乐清市| 新源县| 临沭县| 仲巴县| 陆河县| 翼城县| 五原县| 灵川县| 大理市| 五寨县| 班玛县| 宁晋县| 新沂市|