Google官方在api21以前是不支持设置状态栏颜色的。


在api19开始,我们可以设置window的FLAG_TRANSLUCENT_STATUS, 然后在Activity布局的最顶端放一个和状态栏等高的view实现


但是这个方法有如下问题:

1.  如果Activity布局中有底部的EditText,输入文字时,键盘弹出来,EditText却不会跟着弹起来

2.  如果顶部的view设置成了白色,那么有可能造成状态栏区域的白色文字看不见


针对2的问题,小米和魅族都在尝试去解决问题,但是他们所做的仅仅是在framework中去自动适配,并没有提供api接口


在api21开始,Google开始提供设置状态栏颜色的接口,setStatusBarColor或者window的属性statusBarColor,但是它只支持深色的状态栏颜色,白色的状态栏会使状态栏的文字看不见。

如果你没有调用上面的接口设置状态栏颜色,会怎样?默认情况下,系统会使用默认的状态栏颜色,魅族在此基础上做了一件事情就是:根据你的Activity顶部的颜色自动为你的状态栏设置颜色,但是也有问题:

1. 如果你的Activity中有多个fragment,每个fragment的颜色又不一样,那么statusbar的颜色并不会跟着变,魅族只会以Activity刚开始创建的时候的颜色为准

2. Activity之间切换的时候是有问题的,上面的状态栏的颜色会影响到下面的状态栏的颜色,比如下面Activity的状态栏被自动识别为黑色,上面Activity的状态栏被识别为白色,那么当上面的Activity被销毁时,下面Activity的状态栏颜色会变为白色

感觉魅族有点画蛇添足

在魅族手机上,MainActivity的statusBar颜色会受到红色的windowBackGround影响,statusBarColor属性似乎失效了,但是在布局文件的最外层套一个CoordinatorLayout就可以了,不知道为什么,恶心的魅族


在api23开始,支持浅色的状态栏颜色,使用属性windowLightStatusBar即可


关于statusBarColor属性和colorPrimaryDark属性的关系

colorPrimaryDark有两个:一个是support库里面的,前面没有android前缀,一个是android framework里面的,前面带有android前缀,前者的优先级似乎大于后者。所以如果你的statusBar颜色设置的是纯黑,显示出来的确实灰色,那你就要检查一下,style里面是不是没有设置不带android前缀的colorPrimaryDark属性以及style-21里面的statusBarColor是不是被设置成了transparent,没有设置前面一个colorPrimaryDark属性的话,那么就会采用默认的那个颜色,就是灰色,而状态栏又被设置成透明,所以你就看到了灰色