如今,各大app都将状态栏改变成适合自身app风格的颜色了,颠覆了传统黑白的lowB,状态栏着色,也就是常说的“沉浸式状态栏”。一直觉得这个功能很麻烦很坑爹,网上看资料也只是走马观花,今天闲了下来,准备啃下这块骨头,可是,认真看了几篇文章后,发现这根本不是个骨头,只是我没用心而已,太浮躁了,作为一个靠技术吃饭的,着实应该面壁试过。
“沉浸式状态栏”只有从Android4.4以后的版本,才支持此功能,且谷歌从5.0开始实现了在代码中配置就可以实现这个功能:
private void initToolBarConfig() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
}
这段代码添加到基类Activity中执行段,或者相应Activity的setContentView之前(某些机子这段代码无效果,由于时间原因未做深究)。
但是,如今市场上绝大多数的Android机子都是5.0一下的,所以,必须考虑到4.4-5.0这之间的用户群。解决这个需求有各式各样的方法,为了兼容各个版本的机型和最少的代码量,我们使用最简单的主题配置模式。
思路很简单:1 状态栏透明化,2状态栏着色
第一步:状态栏透明化
需要在values、values-v19、values-v21目录下分别创建相应的主题:
<style name="TranslucentTheme" parent="AppTheme">
</style>
//values-v19
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
//values-v21
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
到AndroidManifest中去给application或者相应的Activity设置主题TranslucentTheme
便是
第一步:状态栏上色
这里有个小问题,是否让组件延伸到状态栏
android:fitsSystemWindows="true"
如果在根布局中添加这个配置,这布局中的第一个组件是不会延伸到状态栏的,如图:
如果不添加,则默认延伸到状态栏。
如果不让逐渐延伸到状态栏,可以个整个Activity设置背景颜色来给状态栏着色,但这可能影响到后期Activity的主题更改,况且,既然是“沉浸式”的,我们最好让第一个组件延伸到状态栏,因为个人觉得,觉得Activity的Style的,往往是第一个组件的,
假设我们的第一个组件是toolBar,直接在toolBar中配置一个paddingTop就好了,至于具体的距离,根据实际而定。
在values、values-v19目录添加如下尺寸:
//values
<dimen name="padding_top">0dp</dimen>
//values-v19
<dimen name="padding_top">25dp</dimen>
然后配置toolBar
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:navigationIcon="@mipmap/ic_launcher"
android:paddingLeft="10dp"
android:paddingTop="@dimen/padding_top"
app:navigationIcon="@mipmap/ic_launcher"
app:title="沉浸式状态栏"/>
PS:如果没有将状态栏事先透明化,当设置toolbar可以被延伸到状态栏的时候,toolBar反而会被状态栏给覆盖。很多同学有时候分不清是否需要在根部局中添加android:fitsSystemWidows="true",分不清的童鞋这样记:true的时候,就是把状态栏当成第一组件,不能被覆盖,false的时候,状态栏就不是第一组件,他可以被覆盖。
更多方法参考:http://www.jianshu.com/p/bae25b5eb867