android 監聽虛擬按鍵的顯示與隱藏
阿新 • • 發佈:2018-12-14
在開發過程中 由於很多機型有有虛擬按鍵 需要我們做一些處理 有時候可能我們做了沉浸式處理 然後在應用在執行的時候 使用者突然隱藏掉虛擬按鍵 導致應用下面一條空白的或者是黑色的 導致使用者體驗不好 這裡就需要我們監聽虛擬按鍵的狀態 來改變佈局 首先 需要監聽虛擬按鍵的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 {
// 虛擬按鍵隱藏時的處理
}
}