最近工作中正好遇到这个问题,其实这个问题的解决方案现在已经非常多了,正好遇到就记录一下。
沉浸式状态栏有很多种,实现方案都不太一样,现在我记录最简单的两种。更多内容可参考Android4.4、Android5.0+状态栏颜色、透明等设置
1.状态栏透明
设置状态栏透明是实现沉浸式状态栏的一种方法,状态栏透明之后,系统会自适应的将状态栏颜色设置为布局的背景颜色。这样实现的状态栏和布局背景相似,但是会多一层灰色阴影。导航栏也是一样的效果。
注意:设置状态透明之后,界面布局会上铺,可以在xml文件的根布局进行相关设置android:fitsSystemWindows="true"
。
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(Color.TRANSPARENT);
2.设置状态栏颜色
如果不想让状态栏有灰色的阴影,可以直接设置状态栏的颜色,或者直接设置状态栏透明,注意,这里的透明和上面的透明不是一种效果,这里的透明是状态真的透明,不会有灰色阴影,背景颜色会铺满状态栏和导航栏,
Window window = getWindow();
//After LOLLIPOP not translucent status bar
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//Then call setStatusBarColor.
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(getResources().getColor(R.color.test_bg));
以上两种都是比较简单的设置方法,需要注意该设置要在setContentView
之前执行,至于图片铺上状态栏,以后再试一试。
用第二种方法设置的状态栏或者导航栏可能会改变状态栏和导航栏字体的颜色,目前网上除了小米和魅族提供的设置状态栏字体颜色的方法,其他厂商还不能改变状态栏/导航栏字体颜色。系统原本只有两套显色方法,白色和黑色,可以在代码中调用window.getDecorView().setSystemUiVisibility
进行相应的设置,设置亮色主题或暗色主题,改变状态栏/导航栏字体颜色。
Window window = getWindow();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 状态栏(以上几行代码必须,参考setStatusBarColor|setNavigationBarColor方法源码)
window.setNavigationBarColor(Color.TRANSPARENT);