setSystemUiVisibility
View類提供了setSystemUiVisibility和getSystemUiVisibility方法,這兩個方法實現對狀態欄的動態顯示或隱藏的操作,以及獲取狀態欄當前可見性。
setSystemUiVisibility(int visibility)方法可傳入的實參為:
- View.SYSTEM_UI_FLAG_VISIBLE:顯示狀態欄,
Activity不全屏顯示(恢復到有狀態的正常情況)。 - View.INVISIBLE:隱藏狀態欄,同時Activity會伸展全屏顯示。
- View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏顯示,且狀態欄被隱藏覆蓋掉。
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏顯示,但狀態欄不會被隱藏覆蓋,狀態欄依然可見,Activity頂端布局部分會被狀態遮住。
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隱藏虛擬按鍵(導航欄)。有些手機會用虛擬按鍵來代替物理按鍵。
- 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來實現狀態欄的顯示與隱藏。