Android沉浸式状态栏

作者: 水中沚_b078 | 来源:发表于2017-07-04 18:07 被阅读628次

关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论布局怎么变,我们根据一定的规律去实现. 总是可以找到合适的方法.

  1. 设置默认主题
  2. 相关属性讲解
  3. 各种布局下沉浸式状态栏如何做

一. 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)

相关文章

网友评论

  • Aldrich_N:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    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);
    }
  • 秦子帅:厉害、受益了。期待哥们回访star

本文标题:Android沉浸式状态栏

本文链接:https://www.haomeiwen.com/subject/ylpxhxtx.html