设置Android系统的状态栏颜色(从Android4.4开始)

来源:互联网 发布:一厢情愿的感情知乎 编辑:程序博客网 时间:2024/05/22 03:49

沉浸式模式:说白了就是手机全屏,这样会给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉;比如打游戏,看视频的界面;

状态栏沉浸式,就是隐藏状态栏;

全屏的代码:

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            getWindow().getDecorView().setSystemUiVisibility(                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION                            | SYSTEM_UI_FLAG_FULLSCREEN                            | SYSTEM_UI_FLAG_IMMERSIVE_STICKY);        }//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//            getWindow().getDecorView().setSystemUiVisibility(//                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE//                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION//                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN//                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION//                            | View.SYSTEM_UI_FLAG_FULLSCREEN//                            | View.SYSTEM_UI_FLAG_IMMERSIVE);//        }        //会让应用的主体内容占用系统状态栏的空间,两个一起使用,状态栏透明        int i = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;        //会让主体内容占据导航栏的空间        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;        //导航栏隐藏        int jjj = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;        //状态栏隐藏        int iii = View.SYSTEM_UI_FLAG_FULLSCREEN;        //点击内容中间位置让导航栏和状态栏都不会显示,        // 除非竖直的时候,从屏幕顶部或者下拉        //水平的时候,从屏幕顶部和侧边向里滑动        //才会显示        int q = View.SYSTEM_UI_FLAG_IMMERSIVE;        //点击内容中间位置让导航栏和状态栏都不会出现        //这个相对于上面那个会弹性隐藏        int w = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

透明化状态栏:内容和状态栏融为一体,状态栏的背景是透明的,内容区会占据状态栏的空间;

要想实现状态栏的背景设置只有在4.4以后才可以设置也就是Api19

首先要实现状态栏全透明,可以做如下设置

   //4.4以上都可以使用(推荐)

  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    //5.0以上才可以使用   
 getWindow().setStatusBarColor(getResources().getColor(android.R.color.transparent));
 让内容布局占据状态栏,(前提是必须设置上面的透明,状态栏有背景颜色都不可以的)
 //布局文件的根属性setFitsSystemWindows 设置为false,那样内容就会占据状态栏(不给状态栏留空间),通过android.R.id.content来寻找
 ((ViewGroup) findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0).setFitsSystemWindows(false);
  //设置状态栏透明,当设置了这个属性setFitsSystemWindows之后,
  如果布局文件的fitsSystemWindows属性为true,那么内容不会占据状态栏
  如果布局文件的fitsSystemWindows属性为false,那么内容会占据状态栏
 使用上面的方式基本上就可以让状态栏透明且内容占据状态栏的空间
 对于5.0以上也可以采用下面这种方式设置
 //5.0以上
 getWindow().setStatusBarColor(getResources().getColor(android.R.color.transparent));
Android手机对状态栏的背景色修改是从Android4.4开始支持(即API19开始),但是4.4到5.0的系统不没有提供java代码api来操作,到了5.0以后可以使用代码设置状态栏的颜色就变得非常容易了,所以,我们主要的工作重心是4.4-5.0之间的机型适配;手机适配状态栏的适配之后的效果如下:


Android4.4的效果:


Android 6.0的效果:


我的解决方案如下:

对于5.0以上的很简单,直接使用java代码编写就可以,这样效果也是最好,不用担心有些国产机型没效果:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0以上            //清除透明背景色状态栏,防止内容区域和状态栏融合            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //设置背景标志,网上说这个要下面一起使用,才会设置背景颜色,其实不设置也可以,最好设置了            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            //设置背景颜色            getWindow().setStatusBarColor(getResources().getColor(R.color.status_bar_color));        }

使用上面的代码5.0以上的就解决了;

最坑是是5.0以下的机型,对于网上的方式,自己弄Demo得时候是可以的,放到自己的项目里就不灵了;对状态栏这块5.0以下,我是各种折腾,各种懵逼;最后为了项目保险起见,选了开源库;

SystemBarTintManager  

这个库快2年多没有更新了,心理不太愿意使用,然而运用到项目的时候没有发现什么问题;考虑到2014年的时候Google已经推出了Android5.0系统,那个时候也就适配到5.0,而5.0之后的就不需要再适配所以作者就没有更新;所以本菜就坚决使用它了;最重要的是这个库就一个类而已;所以直接copy代码了;

在5.0以前如下使用代码:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//5.0以上            setTranslucentStatus(true);        }        SystemBarTintManager tintManager = new SystemBarTintManager(this);        tintManager.setStatusBarTintEnabled(true);        tintManager.setStatusBarTintResource(R.color.status_bar_color);        @TargetApi(19)    protected void setTranslucentStatus(boolean on) {        Window win = getWindow();        WindowManager.LayoutParams winParams = win.getAttributes();        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;        if (on) {            winParams.flags |= bits;        } else {            winParams.flags &= ~bits;        }        win.setAttributes(winParams);    }

另外如果你的布局最外层 是DrawerLayout,那就在最外层加上一个FrameLayout或者LinearLayout或者ReleaLayout,要不然状态栏还是遮挡着内容区;至于为什么,目前我还没有搞清楚为什么?

反正我是使用这种方法完美解决了各种奇葩问题;


0 0