关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论布局怎么变,我们根据一定的规律去实现. 总是可以找到合适的方法.
- 设置默认主题
- 相关属性讲解
- 各种布局下沉浸式状态栏如何做
一. Activity主题设置
这里只是简单设置一下Android所有版本的默认主题.其他与Api19+以及Api21+相关的主题属性,我们在代码里面设置.
1.设置Activity的默认主题
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<!--没有标题-->
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<!--窗口透明-->
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@color/white</item>
</style>
2. 设置主题之后默认如下图
4.4效果 | 7.0效果 |
---|---|
device-2017-06-09-110349-w340 |
3. DrawerLayout CoordinatorLayout AppBarLayout (Toolbar ViewPager)嵌套使用(DrawerLayoutFragment.java)
接上面的布局,如果在上面布局外面再嵌套一层DrawerLayout(布局层次结构如下图),这是我们需要的效果是抽屉展开时,抽屉上层的状态栏是透明的,而CoordinatorLayout区域是有颜色的状态栏.
- 4.4系统无需做任何更改.通过mCoordinatorLayout.setBackgroundColor设置状态栏颜色
- 7.0系统CoordinatorLayout布局的内容会被状态栏挡住,设置fitsystemWindow = "true" ,还是会被挡住,因此需要设置这个布局内容的paddingtop="状态栏高度"属性使内容不被挡住.可以通过mDrawerLayout.setStatusBarBackgroundColor设置状态栏颜色
- 值得注意的是DrawerLayout的fitsystemWindow在布局文件里面必须设置为true,但是在代码里又要设置回false,否则7.0会有半透明的状态栏覆盖在DrawerLayout之上
-
假设我们需要设置侧滑抽屉拉出后的状态栏颜色,这时候又需要区分7.0,4.4系统,对于Api21+直接设置状态栏颜色getWindow().setStatusBarColor,4.4系统则可以通过在activity.findViewById(android.R.id.content))的到的ViewGroup中添加一个高度为状态栏高度的View然后设置状态栏颜色.
92D50605-80E7-44CE-89D4-1FABDD134D8F
实现沉浸式状态栏效果如下
4.4效果 | 7.0效果 |
---|---|
Android4.4效果-w340 | Android7.0效果-w340 |
抽屉展开后的效果 | 抽屉展开后的效果 |
image.png | image.png |
- 对于7.0以上系统不需要特殊设置即可实现沉浸式状态栏
- 4.4以下系统只需要将布局控件的fitsystemwindow设置为false即可
关键代码如下:
mActivity.setTransparentForWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mMainContent.setFitsSystemWindows(false);
mAppbar.setFitsSystemWindows(false);
mCollapsingToolbar.setFitsSystemWindows(false);
mImageView.setFitsSystemWindows(false);
mToolbar.setFitsSystemWindows(false);
ViewGroup.MarginLayoutParams layoutParams =
(ViewGroup.MarginLayoutParams) mToolbar.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin,
layoutParams.topMargin + mActivity.getSystemBarConfig().getStatusBarHeight(),
layoutParams.rightMargin, layoutParams.bottomMargin);
}
```
##最后按照惯例给出GitHub地址
[沉浸式状态栏实现](https://github.com/toutoumu/ControlDemo)
网友评论
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
//set the font color of the title bar, and ignore MIUI Flyme
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}