Android動態顯示和隱藏狀態欄

setSystemUiVisibility

View類提供了setSystemUiVisibility和getSystemUiVisibility方法,這兩個方法實現對狀態欄的動態顯示或隱藏的操作,以及獲取狀態欄當前可見性。

setSystemUiVisibility(int visibility)方法可傳入的實參為:

  1. View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態欄,
    Activity不全屏顯示(恢復到有狀態的正常情況)。
  2. View.INVISIBLE:隱藏狀態欄,同時Activity會伸展全屏顯示。
  3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態欄被隱藏覆蓋掉。
  4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態遮住。
  5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隱藏虛擬按鍵(導航欄)。有些手機會用虛擬按鍵來代替物理按鍵。
  8. View.SYSTEM_UI_FLAG_LOW_PROFILE:狀態欄顯示處于低能顯示狀態(low profile模式),狀態欄上一些圖標顯示會被隱藏。

但該方法必須在setContentView()之前調用否則無法實現相應的功能,如:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

所以一般情況下我們可以通過上面的方法來實現全屏顯示,但由于調用限制,無法實現動態的顯示和隱藏狀態欄。

通過設置Window屬性來實現狀態欄的顯示和隱藏

Android窗口中, 我們可以通過設置window屬性(setAttributes)來實現對狀態的隱藏于顯示。設置屬性時,會用到如下flag值

窗口顯示時,隱藏所有的屏幕裝飾(例如狀態條)。使窗口占用整個顯示區域。
public static final int FLAG_FULLSCREEN = 0x00000400;

控實現顯示隱藏狀態代碼如下

private void setFullScreen(boolean enable) {
    if (enable) {
        WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
        getWindow().setAttributes(attrs);
    } else {
        WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
        getWindow().setAttributes(attrs);
    }
}

上述代碼可以實現全屏和非全面,但每次切換時會根據狀態欄的狀態進行重新布局,為了防止重新進行布局,我們可以再oncreate中添加如下代碼:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

但上面的實現方式還是會有一些問題的,例如當我們使用holo主題的Spinner控件時,但Spinner的item比較多時,由于使用了FLAG_LAYOUT_NO_LIMITS標記,導致Spinner隱藏的item無法顯示出來,滑動式無作用。那針對這種情況我們怎么辦呢? 可以使用setSystemUiVisibility來實現全屏顯示:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

然后再調用setFullScreen來實現狀態欄的顯示與隱藏。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容