简介
在Android 3.0(11)之后,Android提供了setSystemUiVisibility方法,这个方法的作用是可以通过一个flag配置更改状态栏或其他屏幕/窗口装饰的可见性,主要的作用是暂时隐藏掉系统栏的一些UI,让用户能够将注意力更多地集中在应用程序内容上。注意,在使用的时候,有一些flag不一定是API 11 就支持的。大部分都是在API 16的时候增加上的。
这种方式设置显示隐藏导航栏的方式,是作用在view级别的(最终都会聚合到Window起作用),跟设置Window的flag的方式相比,能够更细粒度地控制system bars。
但有一点需要注意的是,System UI Flag 这种方式,是比较容易被清除的,也就是用户的一些操作,会导致你设置的这些flag 被系统自动清除掉。能够触发这种情况的场景分为一下几类:
- 1、触摸屏幕的任何位置;
- 2、顶部下拉状态栏;
- 3、底部上拉导航栏;
- 4、Window变化(切换到其他APP、或者应用的其他界面、软键盘的弹出等)
下面会介绍一下场景的Flag,还有可能被上面这几种场景导致清除的也会简单介绍下。
常用Flag
Flag | 作用 |
---|---|
SYSTEM_UI_FLAG_LOW_PROFILE | 调暗系统状态栏亮度,但不会隐藏, |
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | 允许View能够显示到状态栏的部分,这种场景并不会隐藏状态栏,因此会存在你的UI被状态栏覆盖了一部分(见图1),当然,你可以将fitSystemWindows设置为true,这样子就系统能够自动进行适配(添加状态栏对应高度的padding,见图2) |
SYSTEM_UI_FLAG_FULLSCREEN | 隐藏状态栏,用户的一些操作(第二、第四种),例如跳转到其他APP或者下拉显示状态栏等都会让其flag 被清除,导致状态栏显示出来。因为如果需要再切换回来的时候重新恢复,需要重新设置这个flag. |
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | 在不隐藏导航栏的情况下,让view 所在的window能够显示到导航栏部分,同样可以通过设置fitSystemWindows为true 让系统自动添加高度为导航栏高度的paddingBottom。 |
SYSTEM_UI_FLAG_HIDE_NAVIGATION | 暂时隐藏导航栏,因为系统导航栏非常重要,所以用户的任何操作(上面四种),都会导致他被清除掉,导航栏会重新显示出来,这种场景下,SYSTEM_UI_FLAG_FULLSCREEN也会被同时清除,因此状态栏也会显示出来,基本上这两个都是同时使用的 |
SYSTEM_UI_FLAG_IMMERSIVE | 避免用户的某些操作造成系统自动清除了全屏状态,设置了这个,只有第三、第四种用户交互,才会导致导航栏的隐藏状态被系统自动清除,否则,上面四种交互,都会导致隐藏态被清除,需要配合SYSTEM_UI_FLAG_HIDE_NAVIGATION一起使用 |
SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 同上,也是为了避免某些用户操作造成系统清除全屏状态,设置了这个,只有第四种操作才会导致对应的状态被系统自动清除,另外这个只有在使用了SYSTEM_UI_FLAG_FULLSCREEN、SYSTEM_UI_FLAG_HIDE_NAVIGATION中的一个或者两个,才会起作用 |
SYSTEM_UI_FLAG_LAYOUT_STABLE | 固定布局。场景一:如果你代码设置了setFitsSystemWindows,系统会自动为你的view 加上paddingTop和paddingBottom,那么在从全屏变为非全屏(paddingTop从0变为状态栏高度,paddingBottom从0变为导航栏高度),或者非全屏变为全屏的时候(相反),界面就会出现跳动。如果你加上了这个flag,那界面会自动留出空来,不会造成跳动。 |
注意:
当window设置WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION时,系统会自动添加SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
使用方式
调用对应view的setSystemUiVisibility
进行设置即可。
如果需要设置多个flag,使用 |
如果需要去除掉某个flag,使用~
小结
以上只是列出了常用的一些Flag 相关的作用,如果是有一些其他的诉求,可以再看看官方的详细介绍:https://developer.android.com/reference/android/view/View