虚拟导航栏遮挡布局

简介: 从某种意义上来说,其实是我们的布局顶到人家虚拟导航键下面去了 如图: 这个BUG客户发现的,他用的华为m8手机,自带虚拟导航栏,你懂得!!!! 客户:这是什么情况 ??? 黑人问号? 我 : 额,这个,,我回去看看,放心,只是小问题1.然后百度到一个方法://根布局加android:fitsSystemWindows="true"效果简直爆炸:

从某种意义上来说,其实是我们的布局顶到人家虚拟导航键下面去了
如图:
这里写图片描述

这个BUG客户发现的,他用的华为m8手机,自带虚拟导航栏,你懂得!!!!
客户:这是什么情况 ??? 黑人问号?
我 : 额,这个,,我回去看看,放心,只是小问题


1.然后百度到一个方法:

//根布局加
android:fitsSystemWindows="true"

效果简直爆炸:

这是真机

这里写图片描述

虚拟机

这里写图片描述

我就想问,多出来这一块算谁的?

2.后来,我就认认真真的读资料

  • fitSystemWindows属性:

    官方描述:

    Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
    

    简单描述:

    这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间….

    实际效果:

    当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。


读完,我才发现我自己已经用代码实现了该功能
这就意味着我只要是加入了fitSystemWindows属性,那就是

双倍的padding

附 : 这是我的代码实现

//被我写在了BaseActivity.java

 /**
   * 设置沉浸式状态栏
   */
protected void setStatusBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            final int statusHeight = getStatusBarHeight();
            UUtils.getHandler().post(new Runnable() {
                @Override
                public void run() {
                    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mTitleBarView.getLayoutParams();
                    params.setMargins(0,statusHeight,0,0);
                    mTitleBarView.setLayoutParams(params);
                }
            });
        }
    }


/**
* 获取状态栏的高度
* @return
*/
protected int getStatusBarHeight(){
        try
        {
            Class<?> c=Class.forName("com.android.internal.R$dimen");
            Object obj=c.newInstance();
            Field field=c.getField("status_bar_height");
            int x=Integer.parseInt(field.get(obj).toString());
            return  getResources().getDimensionPixelSize(x);
        }catch(Exception e){
            e.printStackTrace();
        }
        return 0;
    }

3.终于:

在我折腾的过程中,注释掉了

  //透明导航栏
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
           // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
     }

好了哎,真特么的神奇

4.分析

  • 我的手机和虚拟机都是6.0.1
    满足 :

    Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT

    所以,双倍的padding造成下面多出来一部分,其实那就是你的根布局

  • 一开始的虚拟键挡住了我的布局
    其实就是

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    的功劳,他把虚拟键给搞透明了,布局就直接下去了…哈哈

结论:

好好学习,天天向上

相关文章
|
2月前
|
前端开发
二级水平导航菜单栏的实现
二级水平导航菜单栏的实现
32 1
|
4月前
|
前端开发 容器
如何实现一个两栏布局,右侧自适应?三栏布局中间自适应?
要实现一个两栏布局,右侧自适应的效果,可以使用 CSS 的 Flexbox 或 Grid 布局来实现。以下是使用 Flexbox 实现的示例:
35 1
|
5月前
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
【sgDragMove】自定义组件:自定义拖拽组件,仅支持拖拽、设置吸附屏幕边界距离。
|
7月前
3D孪生场景搭建:模型区域摆放
NSDT 3D孪生场景编辑器区域绘制功能详解。
138 0
3D孪生场景搭建:模型区域摆放
|
12月前
|
小程序 JavaScript
小程序顶部导航栏,可滑动,可动态选中放大
小程序顶部导航栏,可滑动,可动态选中放大
175 0
|
JavaScript 前端开发
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局
|
Android开发
虚拟导航(NavigationBar)栏适配
做过屏幕适配的同学都知道Android的NavigationBar适配是个问题,尤其是那些NavigationBar还可以动态隐藏显示的,那就更蛋疼了。
|
容器
布局容器和栅格网格系统
布局容器和栅格网格系统
121 0
html+css实战190-侧导航布局-箭头
html+css实战190-侧导航布局-箭头
131 0
html+css实战190-侧导航布局-箭头
好客租房155-封装顶部导航栏组件(2样式调整)
好客租房155-封装顶部导航栏组件(2样式调整)
61 0
好客租房155-封装顶部导航栏组件(2样式调整)