官网原文:https://developer.android.com/training/system-ui/status.html
隐藏状态栏
这个课程将描述如何在不同版本的上隐藏状态栏。隐藏状态栏(可选:导航栏)可以让你的内容有更多的空间可以显示,从而为用户提供一个更有沉浸式的体验。
图1展示了一个可见的状态栏的程序界面:
图1:状态栏可见
图2展示了一个不可见的状态栏的程序界面,注意:这个action bar也被隐藏了,你永远也不要在状态栏隐藏的情况下显示action bar。
图2:状态栏不可见
在android4.0或以下版本中隐藏状态栏
你可以在android4.0(API 14)或者以下的版本中通过 WindowManager标记来设置,你可以通过代码中来设置或者在你的manifest文件中对某个activity设置主题来达到目的。如果你的状态栏会一直被隐藏掉的话,在你的manifest文件中对某个activity设置主题是首选的方式(严格来说:是覆盖主题中的那个属性),比如:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
使用theme主题的方式有如下几个优点:
1、便于维护且相对于在代码中用WindowManager的标记来说更不容易出错
2、效果会更平滑,因为在实例化(渲染)activity的之前就已经被系统处理了。(此处翻译得不太好,大体意思到了吧)
当然,你还是可以选择用WindowManager的标记来做,如下方法可以简单的在你的代码中来控制状态栏的隐藏与显示:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // If the Android version is lower than Jellybean, use this call to hide // the status bar. if (Build.VERSION.SDK_INT < 16) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } setContentView(R.layout.activity_main); } ... }
当你设置WindowManager标记的时候(不管是代码中设置还是theme中设置),除非你手动清除掉这个标记,这个状态(指的是状态栏隐藏或者显示的状态)将会一直不变。
当你启用了FLAG_FULLSCREEN标记,你可以用FLAG_LAYOUT_IN_SCREEN 来设置你的activity的布局与屏幕的可用空间(大小或尺寸)相同,它可以在你隐藏或显示状态栏的时候使内容区域保持不变。
在android4.1或以上版本中隐藏状态栏
你可以在android4.1(API level 16)以上中设置 setSystemUiVisibility()来隐藏状态栏。setSystemUiVisibility()是在单独的view层级上设置UI标记;这些设置是聚合在window层级的。使用setSystemUiVisibility()来设置UI标记可以让你相对于使用
WindowManager标记来说具有更大的操作性。如下是隐藏状态栏的一个小片段:
View decorView = getWindow().getDecorView(); // 隐藏状态栏 int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); // 如上所说,你永远也不要在状态栏隐藏的情况下显示action bar。所以这里的隐藏就是有必要的。 ActionBar actionBar = getActionBar(); actionBar.hide();注意以下几点:
1、一旦UI标记被清除(比如:通过导航栏离开/关闭了这个activity),如果你还想隐藏状态栏的话,你的app需要重新设置它们。你可以通过这个链接Responding to UI Visibility Changes 来讨论如何监听UI是否可见且作出相应操作。
2、在你设置UI标记的那个地方就开始起作用了(译者注:也就是说在代码那一行运行后就会让状态栏立刻隐藏或显示)。如果你是在activity的onCreate()的方法中隐藏的系统栏(导航栏和状态栏),那么当用户按下Home键,系统栏将重新出现。当用户重新打开activity,onCreate()不会被调用,所以系统栏将会出现。如果你想不受进或出activity的影响,把UI标记设置在
onResume()
或者onWindowFocusChanged()里吧!
3、只如果你调用的这个view是可见的,
setSystemUiVisibility()
这个方法只会起效一次。
4、从这个视图导航(跳转)走了的话,这个view的setSystemUiVisibility()标记将被清除掉。
让内容在状态栏后面显示
在android4.1或者以上版本,你可以设置应用的内容在状态栏后面显示,所以它就不受状态栏的隐藏与显示的影响而重新调整大小。这么干:用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN标记吧!你也可以用SYSTEM_UI_FLAG_LAYOUT_STABLE
来帮助你的应用维持一个稳定的布局。
当你使用了这个方法,你的应用UI中的关键区域(比如:地图应用中的嵌入式控件)的稳定不被系统栏覆盖就变成你的责任了。这可能让你的应用不可用(译者注:我也没搞懂这一句)。在大多数情况下,你可以通过在你的XML布局文件中添加android:fitsSystemWindows这个属性来解决(设置这个属性为true),它会根据系统窗口来设置你的父容器的padding,这个方法对绝大多数的应用来说是可行的。
在某些情况下,不管怎样,你可能需要修改默认的padding值来达到你的目的。通过重写fitSystemWindows(Rect insets)去直接操纵与系统栏的布置关系(像内容插入到系统的窗口一样去占据一个已知大小空间)。当插入到系统窗口的内容改变后,fitSystemWindows()这个方法是被view层级调用的,想要允许系统窗口根据内容来调整可以通过重写这个方法处理任何你想要的插入。