如何屏蔽StatusBar和NavigationBar

如何屏蔽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可以屏蔽掉上述觸發事件。通過以上兩步,先隱藏導航欄和狀態欄,然後屏蔽掉觸發事件,就可以完全屏蔽掉導航欄和狀態欄了。

發佈了40 篇原創文章 · 獲贊 0 · 訪問量 9423
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章