【android学习】沉浸式状态栏解决方案

stytle方式

用stytle方式设置,需要兼容4.4一下,4.4到5.0,以及5.0以上版本

/values/stytle.xml

     
        true
        
        true
        
        

/values-v19/stytle.xml

        
        true
        
        true
         5.0以上设置状态栏的颜色  但是必须是windowTranslucentStatus为false
        @android:color/transparent

/values-v21/stytle.xml 

         
        false
        
        true
        
        @android:color/transparent

代码里面设置

同上面的stytle一样的效果,只是使用的是代码里面设置 

    private void initStatus() {
        //版本大于等于4.4
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //获取到状态栏设置的两条属性
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
            //在4.4之后又有两种情况  第一种 4.4-5.0   第二种 5.0以上
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //第二种 5.0以上
                Window window = getWindow();
                WindowManager.LayoutParams attributes = window.getAttributes();
                attributes.flags |= flagTranslucentNavigation;
                window.setAttributes(attributes);
                window.setStatusBarColor(0);
            } else {
                //第一种 4.4-5.0
                Window window = getWindow();
                WindowManager.LayoutParams attributes = window.getAttributes();
                attributes.flags |= flagTranslucentStatus | flagTranslucentNavigation;
                window.setAttributes(attributes);
            }
        }
    }

修改状态栏颜色

设置状态栏为红色 

    /**
     * 设置StatusBar的颜色
     */
    public void  setStatusBarColor(){
        View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
//        //给根布局设置padding值
        rootView.setPadding(0,getStatusHeight(),0,0);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            //第二种 5.0以上
            getWindow().setStatusBarColor(Color.RED);
        }else{
            //第一种 4.4-5.0
            //获取到根布局
            ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
            View statusBar = new View(this);
            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight());
            statusBar.setBackgroundColor(Color.RED);
            statusBar.setLayoutParams(layoutParams);
            decorView.addView(statusBar);
        }
    }

获取状态栏高度 

    /**
     * 获取状态栏的高度
     * @return
     */
    public int getStatusHeight(){
        //获取到状态栏的资源ID
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        //如果获取到了
        if(resourceId>0){
            //就返回它的高度
            return getResources().getDimensionPixelSize(resourceId);
        }
        //否则返回0
        return 0;
    }

 获取到底部虚拟按键的高度

    /**
     * 获取到底部虚拟按键的高度
     * @return
     */
    public int getNavigationBarHeight(){
        //获取到虚拟按键的资源ID
        int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
        //如果获取到了
        if(resourceId>0){
            //就返回它的高度
            return getResources().getDimensionPixelSize(resourceId);
        }
        return 0;
    }

处理MD中的statusbar颜色

 5.0菜单有阴影:解决办法给NavigationView 加入app:insetForeground="#00000000"

4.4 可以给最外层布局设置fitSystemWidows为true且设置clipToPadding为false

处理以后

你可能感兴趣的:(android学习)