在開發項目一個與通知欄有關的功能時,因爲本身的項目是基於插件形式的因此沒法引入系統可用的佈局文件,這樣沒法自定義佈局,形成沒法自定義通知欄的icon。app
在網上也有一種不用佈局文件更換icon的方法,可是因爲Android的開放性,某些手機廠商會修改通知的源碼,不是使用系統原有的佈局文件方法有必定的侷限性。文章以下http://blog.csdn.net/z1074971432/article/details/10446715有興趣的朋友能夠看下。ide
爲了適配大多數的機型這裏衍生出一種比較曲線救國的方式。。。佈局
public void show(String title, CharSequence content, Bitmap bitmap, PendingIntent intent) spa
{ .net
// 在2.3的機子上,若是id相同的notifation,有一個帶ContentIntent一個不帶就會拋異常插件
_notification.setLatestEventInfo(_context, "", "", null); blog
_notification.flags = _flag; 圖片
RemoteViews hide = _notification.contentView; 開發
initView(_notification,hide, title, content, intent,bitmap); get
_manager.notify(_id, _notification);
}
public void cancel()
{
_manager.cancel(_id);
}
@SuppressWarnings("deprecation")
void initView(final Notification bar, final RemoteViews views, String title, CharSequence text, PendingIntent intent, final Bitmap bitmap)
{
bar.contentView = null;
bar.setLatestEventInfo(_context, title, text, intent);
Notification notification = new Notification();
notification.setLatestEventInfo(_context, "", "", null);
View view = notification.contentView.apply(_context, null);//以notification實例化一個View,這個就是系統當前使用的佈局視圖
ViewGroup group = (ViewGroup) view;
findView(group, new ViewVisitor()
{
@Override
public void onFindView(View item)
{
if (item instanceof ImageView)//查找這個佈局下的ImageView就是icon控件
{
bar.contentView.setInt(item.getId(), "setAlpha", 0);//將原有的icon隱藏,因爲在小米系統中系統設置的icon會覆蓋原有設置的
views.setViewPadding(item.getId(), item.getPaddingLeft(), item.getPaddingTop(), item.getPaddingRight(), item.getPaddingBottom());
if (bitmap != null)
views.setImageViewBitmap(item.getId(), bitmap);//設置icon圖片
else views.setImageViewResource(item.getId(), _context.getApplicationInfo().icon);
}
else if(item instanceof TextView)
{
views.setViewVisibility(item.getId(), View.GONE);//隱藏最上層的view裏的全部的TextView,不與底層的重疊
}
}
});
views.setInt(view.getId(), "setBackgroundColor", Color.argb(0, 0, 0, 0));設置上層佈局的背景透明
views.setViewPadding(view.getId(), 0, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
bar.contentView.addView(view.getId(), views);//將views添加到原有的佈局視圖上
}
public interface ViewVisitor
{
void onFindView(View view);
}
void findView(ViewGroup group, ViewVisitor visitor)//查找視圖裏面的全部子視圖
{
for (int i = 0; i < group.getChildCount(); i++)
{
View view = group.getChildAt(i);
if (visitor != null)
visitor.onFindView(view);
if (view instanceof ViewGroup)
findView((ViewGroup) view, visitor);
}
}
因爲沒法對自定義的佈局進行準肯定位,因此這種方式的icon和佈局大小與原有系統樣式可能有一點誤差!