Android沉浸式状态栏
什么是沉浸式状态栏
沉浸式状态栏本质上就是给系统状态栏着色。当这个颜色和我们Activity中的ToolBar或者ActionBar所使用的背景颜色一致时就会有沉浸式的效果。
怎么给状态栏着色
这里我们在Activity中将状态栏颜色设置为红色:
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.parseColor("#FF0000"));
注意,上面的代码假设当前系统API Level >= 21,因为只有满足条件的SDK版本才能找到该方法;与此同时,在设置状态栏颜色的同时,API文档 告诉我们还需要同步设置WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS这个Window Flag,并且需要保证WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS这个Window Flag没有被设置。否则,不会生效。
上面,我们通过方法调用给系统状态栏着色;当然也可以通过指定Theme来完成;
<style name="CustomAppTheme" parent="android:Theme.Light">
<item name="android:statusBarColor">#00FF00</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
android:windowDrawsSystemBarBackgrounds为true必不可少;就像上面使用setStatusColor方法时需要注意的那样,这个属性相当于添加了FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS(当然你也可以不在Theme中指定这个属性,使用如上代码那种方式添加Window Flag);而从Material Theme中继承时没有那样做,是因为Material Theme中它默认值为true。
注意,上面Theme的声明,对应的资源文件应该在values-v21文件夹下。因为不管是相应的属性,还是对应的Material Theme都是至少API 21才能使用的。
兼容低版本
OK,到此为止,我们所讨论的都是基于API 21以上的。如果低版本该怎么办?低版本的系统是不支持给状态栏着色的,但却可以通过 透明状态栏+透明背景颜色 来实现相同的效果;废话不多说,来看实现。
1、将系统状态栏设置为透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
或者Theme Attribute的方式
<item name="android:windowTranslucentStatus">true</item>
设置对应背景颜色
接下来,就是背景颜色的设置。首先需要将ActionBar或者ToolBar的背景颜色设置为我们需要的颜色,具体如何设置不再深入,请自行研究(这里,如果没有使用到ActionBar或者ToolBar,这一步可直接略过)。
注意,上面透明栏+背景色的方式只适用于API 19以上,因为这个版本以上的系统才支持透明化状态栏,所以,19以下的系统不支持沉浸式状态栏