主要解决notification.contentView.getLayoutId()为空的问题。
今天在做自定义通知栏的时候发现了一个问题,就是我把自定义通知栏里面的字体颜色写成了黑色,然后在我米8(android9.0,api 28)的手机上显示没问题(米8 的通知栏背景颜色是白色),然后我再测试机华为手机上测试了一下(android6.0,api 23),手机上测试了一下就有问题了,这款华为手机的通知栏背景色是灰黑色的,所以我设置的黑色字体就显示的不太清楚了,于是就得想办法搞定它。有两种解决办法。
推荐博客:https://blog.csdn.net/u011200604/article/details/52470770
我就是参照这位大神的代码写的,然后再稍加修改,解决了
notification.contentView.getLayoutId()为空的问题。
对了,网上还有说可以用style样式改变的,但是我试了一下,并没有什么效果,所以就看下面的办法吧
第一种:
就是和360卫士一样,我们只需在自定义的根布局背景颜色设置为白色即可,这样的话,不管我们是在哪里都是可以看到黑色字体的。

不过,当我们在黑色背景的情况下,有一个白底的背景,看起来总是显得很突兀,所以有了第二种办法。
第二种:
获取手机系统通知栏的颜色进行适配,我这里讲解的不是很清楚,可以看上面推荐的博客,
这里就直接看我的代码吧:
public boolean isDarkNotificationTheme() {
return !isSimilarColor(Color.BLACK, getNotificationColor(this));
}
/**
* 获取通知栏颜色
* @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;
}
使用起来也比较简单:
if(isDarkNotificationTheme()){
remoteViews = new RemoteViews(getPackageName(), R.layout.white_remote_view);
}else{
remoteViews = new RemoteViews(getPackageName(), R.layout.remote_view);
}
判断一下,写两个一样的布局,一个字体白色,一个黑色即可,亲测可用。
但是在7.0以及以上的手机就会报
int android.widget.RemoteViews.getLayoutId()为空。
我找了一下,网上就说判断一下是不是7.0级以上手机,不是的话找到layoutId ,是的话,就没什么后话了……
然后我看了一下6.0的手机api是23的,9.0的是28的,然后我的as的
targetSdkVersion版本是26的,于是我就将我们项目的
targetSdkVersion改为23,编译了一下,就可以了,也不会报错了,问题也就解决了,
可能有些人不太了解
targetSdkVersion的意思,在这里推荐一个博客:https://blog.csdn.net/zhangjin12312/article/details/78211328
除了改变版本,我也没有其他办法,如果有大佬解决了问题,方便留言告知的,谢谢了。

本文主要介绍在Android中如何解决自定义通知栏字体颜色在不同手机上显示不清晰的问题。针对华为手机(Android 6.0)通知栏背景颜色导致黑色字体不明显的情况,提供了两种解决方案:1) 设置自定义布局背景为白色;2) 获取系统通知栏颜色进行适配。在API 28及以上版本可能出现`getLayoutId()`为空的错误,建议根据版本进行判断处理。
1万+

被折叠的 条评论
为什么被折叠?



