在开发项目一个与通知栏有关的功能时,由于自己的项目是基于插件形式的所以无法引入系统可用的布局文件,这样无法自定义布局,造成无法自定义通知栏的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和布局大小与原有系统样式可能有一点偏差!

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

  1. Android 读取assets文件下的txt文件

    android 读取assets文件下的txt文件,解决了读取txt文件的乱码问题: package com.example.com.scrollview; import java.io.Buffer ...

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

    有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性来布局,比如我们设置了android:layout_marginTop="100dip ...

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

    本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口 ...

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

    有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性 来布局,比为我们设置了android:layout_marginTop="100di ...

  5. Android为TV端助力 自定义通知栏

    package com.example.mvp; import cn.ljuns.temperature.view.TemperatureView;import presenter.ILoginPre ...

  6. Android中将布局文件转成bitmap

    在实践中发现,有些需要打印的小票高度小于屏幕的高度,而有些小票内容过多高度高于屏幕高度. 小于屏幕高度的布局文件转成bitmap较为容易,高于屏幕高度的布局文件转成长图bitmap较为复杂. 一.小于 ...

  7. android横屏布局文件设置

    一.AndroidManifest.xml配置 1.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入   android:screenOrient ...

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

    一.前言 看到有人问关于xamarin.android的布局没智能提示问题(VS 2015),当然,写布局这东西没提示这是一件相对痛苦的事 ,所以这里就提供一个解决的方案! 二.解决方案 想要智能提示 ...

  9. 如何把android中布局文件(.xml)与相关的类(.java)进行关联?

    eg:把一个布局文件名为page1.xml与MainActivity.java(工程自动生成)进行 1.在存放使用资源的res文件夹下的layout文件夹内新建一个XML布局文件,如命名为:page1 ...

随机推荐

  1. Cordova之如何用命令行创建一个项目(完整示例)

    原文:Cordova之如何用命令行创建一个项目(完整示例) 1. 创建cordova项目 (注意:当第一次创建或编译项目的时候,可能系统会自动下载一些东西,需要一些时间.) 在某个目录下创建cordo ...

  2. 改变浏览器中默认的ctrl+s方法

    在一般的情况下,我们在浏览网页的时候按下ctrl+s,浏览器会弹出一个保存网页的框. 但是在一些特定的网页中,我们希望ctrl+s不是弹出默认的保存窗口,而是进行一下别的操作. 比如在我们使用简书的时 ...

  3. 【16.67%】【codeforces 667C】Reberland Linguistics

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 函数模板“偏特化” (C++)

         模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...

  5. 机器审核图片学习(1)pornDetector

    a) https://github.com/bakwc/PornDetector 封装了两个库,opencv与scikit-learn 另外一种法师封装了opencv与tensorflow

  6. PLC中ST语言的几种程序流程控制语句

    ST语言是IEC61131-3中规定的5中标准语言之一,目前常用见品牌的PLC都支持这种语言(施耐德,AB可以直接选择创建该类型的程序段或者功能块,西门子的略微麻烦一点),ST语言的一个好处是移植性好 ...

  7. yii2.0保留CSS样式的引入

    <link rel="stylesheet" href="http://cdn.staticfile.org/twitter-bootstrap/3.2.0/css ...

  8. 科学的解决Http Token拦截器TokenInterceptor实现

    1.写在前面 在做项目的时候,有时对接口要求比较严谨.先介绍下情况. 我这边Http 方式采用的是 OKhttp+Retrofit 后台一共分为三种token,分别是实名token(accessTok ...

  9. WPF的消息机制(一)- 让应用程序动起来

    原文:WPF的消息机制(一)- 让应用程序动起来 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/powertoolsteam/article/det ...

  10. .NET内置的Ajax工作原理

    在期望不执行回发(postback)而从客户端运行服务器代码的情况下,可以使用ClientScriptManager类来调用客户端回调(callback).这称为对服务器执行带外回调.在客户端回调中, ...