虚拟导航栏遮挡布局

来源:互联网 发布:图片写字软件 编辑:程序博客网 时间:2024/06/05 19:10

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

这个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);
    的功劳,他把虚拟键给搞透明了,布局就直接下去了…哈哈

结论:

好好学习,天天向上

0 0
原创粉丝点击