自定义通知

自定义通知首先明确一点是要用RemoteViews来设置布局

PendingIntent remotePending=PendingIntent.getActivity(MainActivity.this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);RemoteViews contentView=new RemoteViews(getPackageName(), R.layout.remoteview);contentView.setTextViewText(R.id.share_content, "这是自定义的view");contentView.setOnClickPendingIntent(R.id.share_facebook, remotePending);contentView.setOnClickPendingIntent(R.id.share_twitter, remotePending);RemoteViews bigContentView=new RemoteViews(getPackageName(), R.layout.bigcontentview);bigContentView.setTextViewText(R.id.share_content, "这是自定义的view");bigContentView.setOnClickPendingIntent(R.id.share_facebook, remotePending);bigContentView.setOnClickPendingIntent(R.id.share_twitter, remotePending);

  1. RemoteViews适配
我们在使用remoteViews的时候,最怕就是遇到这种情况:因为通知栏的背景色在不同rom上的效果不同,文本颜色就不好确定,你写成白的,那么在白色背景上就有问题,写成黑的,在黑色背景上就有问题。怎么办?之前在网上找的通过style进行处理的方式不可行,我在这里结合 hackware大神提供的方法来获取通知的背景色

public static boolean isDarkNotificationTheme(Context context) {    return !isSimilarColor(Color.BLACK, getNotificationColor(context));}/** * 获取通知栏颜色 * @param context * @return */public static int getNotificationColor(Context context) {    NotificationCompat.Builder builder=new NotificationCompat.Builder(context);    Notification notification=builder.build();    int layoutId=notification.contentView.getLayoutId();    ViewGroup viewGroup= (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null, false);    if (viewGroup.findViewById(android.R.id.title)!=null) {        return ((TextView) viewGroup.findViewById(android.R.id.title)).getCurrentTextColor();    }    return findColor(viewGroup);}private static boolean isSimilarColor(int baseColor, int color) {    int simpleBaseColor=baseColor|0xff000000;    int simpleColor=color|0xff000000;    int baseRed=Color.red(simpleBaseColor)-Color.red(simpleColor);    int baseGreen=Color.green(simpleBaseColor)-Color.green(simpleColor);    int baseBlue=Color.blue(simpleBaseColor)-Color.blue(simpleColor);    double value=Math.sqrt(baseRed*baseRed+baseGreen*baseGreen+baseBlue*baseBlue);    if (value<180.0) {        return true;    }    return false;}
private static int findColor(ViewGroup viewGroupSource) {    int color=Color.TRANSPARENT;    LinkedList viewGroups=new LinkedList<>();    viewGroups.add(viewGroupSource);    while (viewGroups.size()>0) {        ViewGroup viewGroup1=viewGroups.getFirst();        for (int i = 0; i < viewGroup1.getChildCount(); i++) {            if (viewGroup1.getChildAt(i) instanceof ViewGroup) {                viewGroups.add((ViewGroup) viewGroup1.getChildAt(i));            }            else if (viewGroup1.getChildAt(i) instanceof TextView) {                if (((TextView) viewGroup1.getChildAt(i)).getCurrentTextColor()!=-1) {                    color=((TextView) viewGroup1.getChildAt(i)).getCurrentTextColor();                }            }        }        viewGroups.remove(viewGroup1);    }    return color;}

这里有几个注意点

  • TextView textView= (TextView) viewGroup.findViewById(android.R.id.title);可能在有的手机上获取textview为空,所以我想notification的文本区域,系统默认肯定有一个值的,那我就直接遍历找到这个值即可

这样你就可以通过
contentView.setInt(R.id.share_content, "setTextColor", NotificationUtils.isDarkNotificationTheme(MainActivity.this)==true?Color.WHITE:Color.BLACK);

实现颜色替换的功能,setInt、setString的功能是通过反射进行操作的。

本文参考自:http://www.jianshu.com/p/141fc999ac10




更多相关文章

  1. Android Notification 通知封装成工具类
  2. Android 使用颜色矩阵改变图片颜色,透明度,亮度
  3. Android 使用富文本显示web上的内容
  4. Android文本样式——上
  5. Android通知的使用及设置
  6. Android 分享功能实现与 QQ 纯文本分享
  7. Android之RemoteViews篇上————通知栏和桌面小控件

随机推荐

  1. 第三方推送已死
  2. Android加壳native实现
  3. eoe源码阅读(一)
  4. Android生涯半年祭
  5. Flash/Flex 移动端开发 之 现状
  6. 【Android开发学习44】android: 静态XML
  7. Using Dagger2 in Android
  8. Intent 全面理解
  9. 仿豌豆荚实现android连接pc方法
  10. Android中View的滑动冲突——Android开发