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来实现状态栏的显示与隐藏。