1. 程式人生 > >android 監聽虛擬按鍵的顯示與隱藏

android 監聽虛擬按鍵的顯示與隱藏

在開發過程中 由於很多機型有有虛擬按鍵 需要我們做一些處理 有時候可能我們做了沉浸式處理 然後在應用在執行的時候 使用者突然隱藏掉虛擬按鍵 導致應用下面一條空白的或者是黑色的 導致使用者體驗不好 這裡就需要我們監聽虛擬按鍵的狀態 來改變佈局 首先 需要監聽虛擬按鍵的activity implements ViewTreeObserver.OnGlobalLayoutListener; 然後有個onGlobalLayout方法

接下來 獲取到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 {
//            虛擬按鍵隱藏時的處理
        }
    }