监听NavigationBar(导航栏)的显示和隐藏

开发中有些手机上虚拟导航栏(NavigationBar)是可以被控制显示和隐藏的,在界面中有时候往界面根布局中添加的view是通过计算好高度设置进去的,在有些情况下虽然你添加进去的布局已经是Mach_Parent,但当你的NavigationBar被拖动隐藏以后可能会导致内部添加的view的高度底部出现一段空白,这个时候显示不美观了,只能再拖动设置增加高度用来撑满。此时,需要有一个用来监听NavigationBar的显示和隐藏的方法来实现就好了。可是找了好久,发现Android好像是不带NavigationBar的监听的,怎么办呢?

下面介绍一种从另一个角度考虑界面发生变化的时候判断是否是NavigationBar的显示和隐藏。

Step1


// 在初始化View的时候通过findViewById查找activity的根布局容器:

ViewGroup mRootLayout = (ViewGroup) findViewById(android.R.id.content);

Step2


boolean mLayoutComplete;// 用于判断布局是否初始化完成

private void onNavigationBarStatusChanged() {
    mRootLayout.post(() -> {
        // 布局完成
        mLayoutComplete =true;
    });
    mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
        if (!mLayoutComplete){
          return;
        }
        onNavigationBarStatusChanged(mRootLayout);
    });
}

private int mRootlayoutHeight =0;// 用于记录上一次屏幕的高度

public void onNavigationBarStatusChanged(ViewGroup rootlayout) {
     int _rh = rootlayout.getHeight();// 当前屏幕高度
     if (mRootlayoutHeight ==0) {
         mRootlayoutHeight = _rh;// 记录首次变化的屏幕高度
     }

    if (mRootlayoutHeight != _rh){// 如果为true,则说明NavigationBar发生的显示和隐藏。
        changeHeight = _rh -mRootlayoutHeight;//(备注) 说明:如果计算的值差不多在屏幕一半的2/3高度左右则大概说明是键盘发生的显示和隐藏
        int pagerviewHeight =container.getHeight();// 获取需要改变的view的高度
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)container.getLayoutParams();
        layoutParams.height =pagerviewHeight +changeHeight;
        container.setLayoutParams(layoutParams);
        mRootlayoutHeight = _rh;// 将当前高度重新赋值为最新临时变量
    }
}

这只是一点点思路,方法可能还有更多,但能给你提供思路也够了。