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,監聽也會回調,這點可以根據自己需求優化。