原文地址:http://android.xsoftlab.net/training/system-ui/status.html
这节课将会介绍如何隐藏不同的版本的状态条。隐藏状态条可以使内容展示区域更大,因此可以提供一种更强的身临其境的用户体验。
含有状态条的APP:
隐藏状态条的APP,注意这里的ActionBar同样也隐藏了。绝不要在没有状态条的时候还显示ActionBar:
在Android 4.0以下的版本中隐藏状态条
开发者可以通过设置WindowManager的标志来隐藏Android 4.0之前的状态条。除此之外在清单文件中设置Activity的主题也可以达到同样的效果。如果需要状态条一直保持隐藏状态,那么在清单文件中设置主题是我们的首选方式:
<application
...
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
...
</application>
使用Activity主题的优势在于:
- 相对于动态设置来说更易于维护也减小了出错的风险。
- 这会使得UI转场更加平滑,因为系统在实例化Activity之前J就已经得到了它需要的UI渲染信息(状态条隐藏等等)。
开发者可以通过设置WindowManager的标志来达到同样的目的。这种方法适合用户与APP交互的时候使用。
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标志(不论是通过Activity的主题还是动态的设置),那么该标志则会一直保留,直到将该标志移除。
在Android 4.1以上的版本中隐藏状态条
你可以通过使用setSystemUiVisibility()方法隐藏Android 4.1以上系统的状态条。setSystemUiVisibility()为单个的View层级设置了UI标志;这些设置被整合进了Window层级。setSystemUiVisibility()比WindowManager的控制粒度更细。下面的代码隐藏了状态条:
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();
要注意以下几个方面:
- 一旦UI的标志被清除(比如,通过导航的方式离开了Activity),那么如果你想重新隐藏状态条的话则需要重新设置这些标志。
- 在不同的地方设置UI标志还有些差异。如果在Activity的onCreate()方法中隐藏了系统条,这时用户返回了桌面,那么系统条则会再次出现。当用户重新打开Activity时,onCreate()不会被再次调用,所以系统条会一直保持可见。如果你想使系统条还保持原来的状态的话,则需要在onResume()中或onWindowFocusChanged()中设置相应的标志。
- setSystemUiVisibility()只有在View可见的时候设置才有效。
- 由导航的方式离开View会使由setSystemUiVisibility()设置的标志被清除。
使内容显示在状态条的后面
在Android 4.1以上的版本中,你可以将应用的内容区域显示在状态条的后面,所以内容区域的尺寸并不会随着状态条的隐藏显示而变化。通过使用SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN标志来实现这一点。你可能还需要使用SYSTEM_UI_FLAG_LAYOUT_STABLE标志来辅助APP维持一个稳定的布局状态。
当你使用了这项方法,那么你就有责任确保APP UI的边界部分不会被系统条所遮盖。在很多情况下,你可以通过在布局文件中添加android:fitsSystemWindows=true属性来处理这种情况。它会调整父ViewGroup的内边距来留出系统窗口的空间,这种方法足以应对大多数的应用。
随着ActionBar的变换同步状态条
在Android 4.1以上的版本中,为了避免重新调整布局的尺寸,当ActionBar显示或隐藏时,你可以开启ActionBar的Overlay Mode。当处于Overlay Mode下时,Activity的布局会使用所有的可用空间,就仿佛ActionBar不存在一样,系统会将ActionBar绘制在布局的上面一层。这会使布局顶部的部分变的模糊,不过当ActionBar显示或者隐藏时,系统并不会重写调整布局的尺寸,这会使得转场过程无缝对接。
为了可以使ActionBar开启Overlay Mode,你需要创建一个自定义主题,并需要继承已有的携带ActionBar的主题,并需要将android:windowActionBarOverlay属性设置为true即可。