Android 适配通知栏的字体颜色

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

主要解决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

除了改变版本,我也没有其他办法,如果有大佬解决了问题,方便留言告知的,谢谢了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值