Android虛擬導航欄顯示隱藏監聽

Android虛擬導航欄顯示隱藏監聽


部分手機自帶虛擬導航欄,導航欄的顯示/隱藏會引起一些佈局問題。下面自定義虛擬導航欄監聽,希望對大家有所幫助。

代碼塊

代碼塊語法遵循標準markdown代碼,例如:

public class ScreenUtils {

    /**
     * 獲取手機屏幕高度
     */
    public static int getHeight() {
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) MApplication.getInstance().getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        return dm.heightPixels;
    }

    /**
     * 獲取屏幕真實高度(包括虛擬鍵盤)
     *
     */
    public static int getRealHeight() {
        WindowManager windowManager = (WindowManager) MApplication.getInstance().getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            display.getRealMetrics(dm);
        } else {
            display.getMetrics(dm);
        }
        int realHeight = dm.heightPixels;
        return realHeight;
    }

    public interface NavigationListener {
        void show();
        void hide();
    }

    //虛擬導航欄顯示/隱藏
    public static void setNavigationListener(final View rootView, final NavigationListener navigationListener){
        if (rootView == null || navigationListener == null) {
            return;
        }
        if (getRealHeight() != getHeight()) {
            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                int rootViewHeight;
                @Override
                public void onGlobalLayout() {
                    int viewHeight = rootView.getHeight();
                    if (rootViewHeight != viewHeight) {
                        rootViewHeight = viewHeight;
                        if (viewHeight == getRealHeight()) {
                            //隱藏虛擬按鍵
                            if (navigationListener != null) {
                                navigationListener.hide();
                            }
                        } else {
                            //顯示虛擬按鍵
                            if (navigationListener != null) {
                                navigationListener.show();
                            }
                        }
                    }
                }
            });
        }
    }
}

注:
1、getRealHeight()-getHeight()即爲虛擬導航欄高度。
2、有個小問題就是調用此方法Activity未被銷燬,即使跳轉到其他activity,監聽也會回調,這點可以根據自己需求優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章