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

你可能感兴趣的:(Android动态显示和隐藏状态栏)