Android 自定义通知Notification 适配不同背景颜色
2017-09-13 10:19
591 查看
自定义通知
自定义通知首先明确一点是要用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);
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<ViewGroup> 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/426d85f34561
相关文章推荐
- Android 自定义通知Notification 适配不同背景颜色
- Android 自定义Notification字体颜色适配
- android使用Notification进行通知时有时候通知栏中的项背景是灰白的的,而不是根据手机系统的颜色而定
- Android 自定义Notification字体颜色适配
- Android 自定义Notification颜色适配问题
- 59 Android Notification 自定义通知
- Android 自定义 spinner (背景、字体颜色)
- Android中自定义SeekBar背景颜色,进度条颜色,滑块图片
- Android自定义通知样式适配
- android实现下拉框(spinner),自定义大小颜色背景位置,去掉默认样式黑边
- android ics 自定义notification背景问题
- android中notification通知及自定义notification
- Android 更改纯色背景图片颜色,可实现一张背景圆形图片展示不同颜色
- Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
- Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)
- Android代码中设置图片,文本自定义颜色,Linearlayout等控件设置背景
- 通知Notification(可展开的大布局)使用,适配android8.0
- Android中自定义SeekBar的背景颜色,进度条颜色,以及滑块的图片
- android 通知栏背景颜色跟随app导航栏背景颜色变化而变化
- Android 自定义 spinner (背景、字体颜色)