如何屏蔽StatusBar和NavigationBar
代碼
mLockWindowLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
hideStatusBarAndNavigationBar();
mWindowManager.addView(view, mLockWindowLayoutParams.type)
private void hideStatusBarAndNavigationBar() {
int flag = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
flag |= View.SYSTEM_UI_FLAG_FULLSCREEN;
flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
flag |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
flag |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
flag |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
flag |= View.SYSTEM_UI_FLAG_IMMERSIVE;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mLockScreenWindow.setSystemUiVisibility(flag);
}
}
原理
很多時候我們需要隱藏導航欄和狀態欄,但Android系統把它們視爲系統級別的UI組件,沒有暴露出相應的接口;相關的StatusBarManager在源碼中是hide的,且需要的權限也只有系統app可以獲取;所以不能通過常規的方式來實現上述功能。
上面代碼中的實現方式能夠達到隱藏導航欄和狀態欄的目的,但是有權限的限制,需要擁有權限,特別是在23版本以上系統中需要開啓顯示在其他應用之上權限。
實現原理是在WindowManager中添加View,layoutParams的type設爲TYPE_SYSTEM_ERROR;在添加View之前需要先隱藏導航欄和狀態欄,通過hideStatusBarAndNavigationBar();但是隱藏之後還是會點擊或者下拉觸發導航欄和狀態欄的顯示,通過添加View可以屏蔽掉上述觸發事件。通過以上兩步,先隱藏導航欄和狀態欄,然後屏蔽掉觸發事件,就可以完全屏蔽掉導航欄和狀態欄了。