android 监听虚拟按键的显示与隐藏

在开发过程中 由于很多机型有有虚拟按键 需要我们做一些处理 有时候可能我们做了沉浸式处理 然后在应用在运行的时候 用户突然隐藏掉虚拟按键 导致应用下面一条空白的或者是黑色的 导致用户体验不好 这里就需要我们监听虚拟按键的状态 来改变布局
首先 需要监听虚拟按键的activity 实现ViewTreeObserver.OnGlobalLayoutListener

MainActivity implements  ViewTreeObserver.OnGlobalLayoutListener

接下来 获取到activity最外层Layout

 RelativeLayout layout = findViewById(R.id.activity_layout );

然后设置在onResume()给Layout设置OnGlobalLayoutListener onPause()注释OnGlobalLayoutListener
这里解释一下:
OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。
由于OnGlobalLayoutListener可能会被多次触发,onPause()所以要在要将OnGlobalLayoutListener注销掉。

    @Override
        protected void onResume() {
        super.onResume();
        layout .getViewTreeObserver().addOnGlobalLayoutListener(this);
    }
        @Override
    protected void onPause() {
        super.onPause();
        layout .getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }

然后一个获取虚拟按键是否显示的方法

 public boolean isNavigationBarShow(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point size = new Point();
            Point realSize = new Point();
            display.getSize(size);
            display.getRealSize(realSize);
            boolean  result  = realSize.y!=size.y;
            return realSize.y!=size.y;
        }else {
            boolean menu = ViewConfiguration.get(activity).hasPermanentMenuKey();
            boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
            if(menu || back) {
                return false;
            }else {
                return true;
            }
        }
    }

最后在onGlobalLayout()中调用isNavigationBarShow()并做判断

    @Override
    public void onGlobalLayout() {
        if (isNavigationBarShow(this)) {
//    虚拟按键显示的时候的处理
        }else {
//            虚拟按键隐藏时的处理
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_40967402/article/details/82989074