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

时间: 2025-01-02 19:01:21

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

Android -- Layout布局文件里的android:layout_height等属性为什么会不起作用?

有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性来布局,比如我们设置了android:layout_marginTop="100dip",但是运行程序后发现一点作用都没有,相似的还有layout_height等以android:layout_开头的属性设置都没有作用,这类问题以我们使用Adapter的作为数据源的时候作用居多,因为Adapter里有一个方法是getView,这个返回的VIew是一个从XML布局里加载的,一般如下:

Xamarin.Android之布局文件智能提示问题

Xamarin.Android之布局文件智能提示问题 一.前言 看到有人问关于xamarin.android的布局没智能提示问题(VS 2015),当然,写布局这东西没提示这是一件相对痛苦的事 ,所以这里就提供一个解决的方案! 二.解决方案 想要智能提示,肯定也是要有相应的文件的!!! 第一步.把这两个文件放在  VS安装目录\Xml\Schemas   这个文件夹下面 第二步.在VS中把这两个用起来 打开工具栏的XML->Schemas 通过添加按钮把那两个文件添加进去(按理说,只需要添加那个

Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起

本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口),一个Dialog,一个Toast,一个Menu菜单等. 首先对相关类的作用进行一下简单介绍: Window 类   位于 /frameworks/base/core/java/android/view/Window.java 说明:该类是一个抽象类,提供了绘制窗口的一组通用API.可以将之理解为

Android Layout布局文件里的android:layout_height等属性不起作用

有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性 来布局,比为我们设置了android:layout_marginTop="100dip",但是运行程序后发现一点作用都没有,相似的还有layout_height等以android:layout_开头的属性设置都没有作用,这类问题以我们使用Adapter的作为数据源的时候作用居多,因为Adapter里有一个方法是getView,这个返回的VIew是一个从XML布局里加载的,一般如下:

android 五大布局文件

android中为了适应各种布局的格式,提供了5种布局格式: LinearLayout(线性布局)FrameLayout(帧布局)RelativeLayout(相对布局)TableLayout(表格布局)AbsoluteLayout(绝对布局). 在android的项目中,我们要设计出让人耳目一新的界面,无时无刻都要用到这些布局格式.这些布局文件主要是以xml文件的格式存在,并且保存在/res/layout目录下.此文件夹下存着我们写的各种布局文件.例如:/res/layout/activity

android横屏布局文件设置

一.AndroidManifest.xml配置 1.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入   android:screenOrientation="landscape"属性即可(landscape是横向,portrait是纵向) 或 2.通过在里面调用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);方法,就可以设置横屏了,同样,也可以设

Android中将布局文件转成bitmap

在实践中发现,有些需要打印的小票高度小于屏幕的高度,而有些小票内容过多高度高于屏幕高度. 小于屏幕高度的布局文件转成bitmap较为容易,高于屏幕高度的布局文件转成长图bitmap较为复杂. 一.小于屏幕高度的布局文件转成bitmap 1.需求 在交易过程中常常需要打印小票,利用布局文件组织小票格式,并将其转成bitmap之后打印出来较为方便. 2.布局文件转bitmap public class ReceiptViewActivity extends Activity{ private Vie

Android中布局文件的创建

在 Android应用程序中,界面是通过布局文件设定的.布局文件采用XML格式,每个应用程序默认包含一个主界面布局文件,该文件位于项目的 res/layout 目录中.接下来创建一个“布局”程序,此时会看到一个界面设计面板,如图1所示. 图1 布局文件 从图1中可以看出,布局文件窗口中有两个选项卡,分别是 Graphical Layout.activity_main.xml.其中 Graphical Layout是布局文件的图形化视图,在该视图中可以通过鼠标将 Palette 窗口中的控件直接拖

Android的布局文件遇到Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V问题

打开xml的布局文件,发现布局无法显示预览,而且报错:Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V.原来是因为用了最新的API 20.这个是Android用于开发可穿戴设备的,不支持EditText.将API改为20之前的就行了.