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

stytle方式

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

/values/stytle.xml

     <!-- 状态栏透明设置 必须是4.4以上的版本-->
        <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
        <!-- 虚拟按键透明设置 -->
        <item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
        <!-- 5.0以上设置状态栏的颜色  但是必须是windowTranslucentStatus为false  -->
        <!--<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>-->

/values-v19/stytle.xml

        <!-- 状态栏透明设置 必须是4.4以上的版本-->
        <item name="android:windowTranslucentStatus">true</item>
        <!-- 虚拟按键透明设置 -->
        <item name="android:windowTranslucentNavigation">true</item>
         5.0以上设置状态栏的颜色  但是必须是windowTranslucentStatus为false
        <item name="android:statusBarColor">@android:color/transparent</item>

/values-v21/stytle.xml 

         <!--状态栏透明设置 必须是4.4以上的版本-->
        <item name="android:windowTranslucentStatus">false</item>
        <!-- 虚拟按键透明设置 -->
        <item name="android:windowTranslucentNavigation">true</item>
        <!-- 5.0以上设置状态栏的颜色  但是必须是windowTranslucentStatus为false  -->
        <item name="android:statusBarColor">@android:color/transparent</item>

代码里面设置

同上面的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

处理以后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值