在Android4.4之后开始支持沉浸式状态栏,如下图
![](https://img.haomeiwen.com/i12648131/028a4979891241fe.png)
(1)起初Android4.4(API19)开始实现沉浸式状态栏
自从Android4.4之后,Android开始支持沉浸式状态栏,实现方式有两种
-
设置
FLAG_TRANSLUCENT_STATUS
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-
在主题中添加属性
<item name="android:windowTranslucentStatus">true</item>
在4.4手机中的效果如下(左图黑色的状态栏没有消失,右图已经实现了沉浸式效果)
![](https://img.haomeiwen.com/i12648131/b418c75e103fbe82.png)
在5.0和8.0手机的效果如下(左图和右图都有灰色的阴影)
![](https://img.haomeiwen.com/i12648131/86cc281a01ba0a18.png)
经过多重机型的测试,我们发现并不是所有的手机都能完美实现沉浸式效果的状态栏。
(2)Android5.0以后,解决状态栏灰色阴影的问题
代码如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(getResources().getColor(android.R.color.holo_red_light));
}
或者设置主题
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
Android5.0和Android8.0的效果如下:
![](https://img.haomeiwen.com/i12648131/ca5b2415d3328ff9.png)
(3)Android6.0以后支持修改状态栏图片的颜色
//设置状态栏图标颜色为浅黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
或者在主题中添加
<item name="android:windowLightStatusBar">true</item>
(4)适配建议
前面三点基本已经算是各版本适配的全部了,为了更好的完善适配问题,还是不要使用主题的好,因为这样看起来很乱,可读性差。
这里推荐使用纯代码适配
。
(5)纯色适配
纯色适配相对比较简单,下图就是效果
![](https://img.haomeiwen.com/i12648131/ba3b58d170afb663.png)
代码实现分两步:
1.设置fitsSystemWindows为true,比如标题栏使用Toolbar,那么就用Toolbar设置fitsSystemWindows为true;
2.添加以下代码:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/statusbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:text="标题"
android:layout_gravity="center_horizontal"
android:textSize="20sp"/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
//设置状态栏图标颜色为浅黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
//修改状态栏颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary));
}else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//Android4.4以上手机-顶部状态栏透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//Android4.4以上手机-底部导航栏透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
(6)图片适配
图片适配的效果如下
![](https://img.haomeiwen.com/i12648131/028a4979891241fe.png)
由于我们需要做到图片延伸到屏幕顶端的效果,所以就不能设置fitsSystemWindows为true了。
代码如下:
//设置状态栏图标颜色为浅黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//Android4.4以上手机-顶部状态栏透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//Android4.4以上手机-底部导航栏透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
但是,部分5.0以上的手机状态栏有阴影,目前没有什么好的办法解决,5.0新增的setStatusBarColor在这种情况也不太适合。
![](https://img.haomeiwen.com/i12648131/856e26b0489a70a9.png)
(7)三方库
网上三方库还是比较多的,android4.4以上沉浸式状态栏和导航栏实现以及Bar的其他管理这个三方库还是比较推荐使用的。
网友评论