美文网首页
监听NavigationBar(导航栏)的显示和隐藏

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

作者: NewNiu | 来源:发表于2018-07-16 14:47 被阅读0次

    开发中有些手机上虚拟导航栏(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;// 将当前高度重新赋值为最新临时变量
        }
    }
    

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

    相关文章

      网友评论

          本文标题:监听NavigationBar(导航栏)的显示和隐藏

          本文链接:https://www.haomeiwen.com/subject/vzkbpftx.html