YCStatusBar

Introduction: 关于状态栏方案总结案例,适合于绝大多数的使用场景……积累了业余阅读代码中的状态栏工具类,并且整理和去除了无效的代码。已经用于实际项目,一键集成并使用!
More: Author   ReportBugs   
Tags:
  • 1.关于如何集成
  • 2.关于如何使用
  • 3.关于鸣谢
  • 4.关于版本更新说明
  • 5.出现的 bug 及解决方案
  • 6.关于其他介绍

0.说明

1.关于如何集成

2.关于如何使用

  • 2.1.1 DrawerLayout 设置状态栏

    //为 DrawerLayout 布局设置状态栏颜色,纯色
    DlStatusBar.setColorNoTranslucentForDrawerLayout(this, drawerLayout,getResources().getColor(R.color.colorTheme));
    //为 DrawerLayout 布局设置状态栏变色,也就是加上透明度
    DlStatusBar.setColorForDrawerLayout(this, drawerLayout,getResources().getColor(R.color.colorTheme), 0);
    
  • 2.1.2 设置状态栏颜色

    StateAppBar.setStatusBarColor(this, ContextCompat.getColor(this, R.color.colorAccent));
    
  • 2.1.3 设置状态栏和 toolbar 颜色

  • 注意,如果是设置白色的话,则需要单独设置状态栏字体的颜色,否则看不见
  • 如果要设置状态栏为白色:则直接可以使用 2.7 中的方法

    StateAppBar.setStatusBarColor(this, ContextCompat.getColor(this, R.color.colorAccent));
    
  • 2.1.4 设置状态栏透明

    StateAppBar.translucentStatusBar(this, true);
    
  • 2.1.5 设置状态栏 coordinatorLayout 颜色

    StateAppBar.setStatusBarColor(this, ContextCompat.getColor(this, R.color.colorPrimary));
    
  • 2.1.6 设置状态栏 coordinatorLayout 颜色透明

    StateAppBar.setStatusBarColorForCollapsingToolbar(this, mAppBarLayout, collapsingToolbarLayout, toolbar, ContextCompat.getColor(this, R.color.colorPrimary));
    
  • 2.1.7 设置状态栏颜色为白色

    StateAppBar.setStatusBarLightMode(this, Color.WHITE);
    
  • 2.1.8 设置状态栏和 toolbar 颜色为白色

    StateAppBar.setStatusBarLightMode(this, Color.WHITE);
    
  • 2.1.9 设置状态栏和 coordinatorLayout 为白色

    StateAppBar.setStatusBarLightForCollapsingToolbar(this, mAppBarLayout, collapsingToolbarLayout, toolbar, Color.WHITE);
    
  • 2.2.0 单 Activity 多 Fragment 动态修改状态栏颜色

  • 如果是单 Activity 多 Fragment,由 Fragment 控制状态栏颜色的应用,有两种方案:
  • 1.由 Activity 控制状态栏背景颜色和字体颜色,提供方法供 Fragment 调用即可。
  • 2.首先设置 Activity 侵入状态栏,并设置状态栏为透明色,相当于隐藏 Activity 的状态栏, 然后在 BaseFragment 中封装状态栏,由 Fragment 控制自己的颜色即可; 但是状态栏字体颜色还是需要通过 Activity 控制。
  • 第一种方法:直接在 activity 中操作

    //例如,ViewPager+TabLayout+Fragment 中,很常见
    @Override
    public void onPageSelected(int position) {
      switch (position){
          case 0:
              //设置状态栏为黑色
              StateAppBar.setStatusBarColor(StatusBarFragmentActivity.this,
                      ContextCompat.getColor(StatusBarFragmentActivity.this,
                              R.color.colorTheme));
              break;
          case 1:
              //设置状态栏为红色
              StateAppBar.setStatusBarColor(StatusBarFragmentActivity.this,
                      ContextCompat.getColor(StatusBarFragmentActivity.this,
                              R.color.colorAccent));
              break;
          case 2:
              //设置状态栏为蓝色
              StateAppBar.setStatusBarColor(StatusBarFragmentActivity.this,
                      ContextCompat.getColor(StatusBarFragmentActivity.this,
                              R.color.colorPrimary));
              break;
          case 3:
              //设置状态栏为透明,相当于隐藏状态栏,也称之为沉浸式状态栏
              StateAppBar.translucentStatusBar(StatusBarFragmentActivity.this,
                      true);
              break;
          case 4:
              //设置状态栏为白色
              StateAppBar.setStatusBarColor(StatusBarFragmentActivity.this,
                      ContextCompat.getColor(StatusBarFragmentActivity.this,
                              R.color.white));
              //状态栏亮色模式,设置状态栏黑色文字、图标
              StatusBarUtils.StatusBarLightMode(StatusBarFragmentActivity.this);
              break;
      }
    }
    
  • 第一种方法:activity 和 Fragment 配合使用

    • 首先设置 Activity 侵入状态栏,并设置状态栏为透明色,相当于隐藏 Activity 的状态栏, 然后在 BaseFragment 中封装状态栏,由 Fragment 控制自己的颜色即可; 但是状态栏字体颜色还是需要通过 Activity 控制。
//在 activity 中
StateAppBar.translucentStatusBar(this,true);

//在 fragment 中
//判断是否展示—与 ViewPager 连用,进行左右切换
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser){
        if(activity!=null){
            StateAppBar.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.white));
            //状态栏亮色模式,设置状态栏黑色文字、图标
            //注意:如果是设置白色状态栏,则需要添加下面这句话。如果是设置其他的颜色,则可以不添加,状态栏大都默认是白色字体和图标
            StatusBarUtils.StatusBarLightMode(activity);
        }
    }//展示
}
  • 2.2.1 可以自由设置状态栏中的字体,图标颜色
    • 支持类型,1:MIUUI 2:Flyme 3:android6.0
    • 目前只是支持改变状态栏中字体图标为黑色,思考是否有可能改变其他颜色呢?
      //状态栏亮色模式,设置状态栏黑色文字、图标
      StatusBarUtils.StatusBarLightMode(StatusBarFragmentActivity.this);
      

3.关于鸣谢

  • 关于状态栏,是经过阅读一些项目慢慢总结而来的。
  • 非常方便使用,具体的用法都已经整理成 demo,欢迎直接看代码,如果可以麻烦 star!
  • 感谢开源前辈们的无私奉献……

4.关于版本更新说明

  • v0.0 更新于 2016 年 3 月 9 日
  • v1.0 更新于 2017 年 9 月 8 日
  • v1.1 更新于 2017 年 12 月 5 日
  • v1.3 更新于 2018 年 3 月 16 日
  • v1.3.1 更新于 2018 年 9 月 1 日
    • 添加了单 Activity 多 Fragment 动态修改状态栏颜色功能

5.出现的 bug 及解决方案,欢迎提出更多 bug

  • 1.如果是在设置 fragment 中,有的是白色【或者其他色】,有的是透明色【就相当于隐藏了状态栏】,则还是会出现设置透明色无效
    • 解决办法:
    • 这其实更像是一个效果,而不是问题,透明色时应该显示了下面的 Fragment 的颜色,所以看起来无效。
    • 实际上每一个 Activity 的 Window 都有背景色,如果你把 Activity 的 Window 设置为透明色,也会出现这个效果,
    • 所以你应该给 Fragment 的 RootView 设置一个背景色,才能更像一个 Activity,再设置透明色就没有问题了
  • 2.横屏状态栏问题
    • 比如视频播放器,横屏是需要隐藏状态栏,也可以成为透明状态栏,部分手机失效
    • 建议可以直接移除状态栏,可以参考我的视频播放器:https://github.com/yangchong211/YCVideoPlayer
  • 3.设置状态栏颜色无效
    • 状态栏字体颜色只适合 6.0 以上或者小米和魅族手机
  • 4.多个 EditText 会遮挡的问题
    • 最外层布局不要使用 LinearLayout ,而需要使用 scrollView
  • 5.弹出 FragmentDialog 的时候设置背景色变暗,状态栏的颜色变白
    • 如果是全屏的 dialogFragment 是可以修改状态栏字体颜色,其他情况都不可以修改

6.状态栏系列文档

  • 01.状态栏基础介绍
    • 01.透明状态栏和沉浸式
    • 02.theme 主题对状态栏影响
    • 03.如何给状态栏着色
    • 04.注意 4.4 状态栏着色
    • 05.如何设置状态栏透明
    • 06.状态栏不占位的问题
    • 07.修改状态栏文字颜色
  • 02.状态栏属性深入分析
    • 01.状态栏的发展过程介绍
    • 02.android6.0 状态栏内容不见
    • 03.setSystemUiVisibility
    • 04.fitsSystemWindows 深入分析

6.关于其他介绍

关于我的博客

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools