美文网首页
Android动态显示和隐藏状态栏

Android动态显示和隐藏状态栏

作者: ccbuluo | 来源:发表于2017-05-10 19:45 被阅读0次

    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动态显示和隐藏状态栏

          本文链接:https://www.haomeiwen.com/subject/gtogtxtx.html