Android无布局文件下自定义通知栏notification的 icon

在开发项目一个与通知栏有关的功能时,由于自己的项目是基于插件形式的所以无法引入系统可用的布局文件,这样无法自定义布局,造成无法自定义通知栏的icon。

在网上也有一种不用布局文件更换icon的方法,但是由于Android的开放性,某些手机厂商会修改通知的源码,不是使用系统原有的布局文件方法有一定的局限性。文章如下http://blog.csdn.net/z1074971432/article/details/10446715有兴趣的朋友可以看下。

为了适配大多数的机型这里衍生出一种比较曲线救国的方式。。。

public void show(String title, CharSequence content, Bitmap bitmap, PendingIntent intent)

{

    // 2.3的机子上,如果id相同的notifation,有一个带ContentIntent一个不带就会抛异常

    _notification.setLatestEventInfo(_context, "", "", null);

    _notification.flags = _flag;

    

    RemoteViews hide = _notification.contentView;

    

    initView(_notification,hide, title, content, intent,bitmap);

    

    _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和布局大小与原有系统样式可能有一点偏差!

原文地址:https://www.cnblogs.com/anye6488/p/4069795.html