有时我们为了获取更大的空间去显示app内容,会对状态栏和导航栏进行隐藏,以达到更好的沉浸式体验。而本文就是对不同android版本上如何隐藏状态栏的描述。
图二,显示了状态栏不可见的app,同时可以发现app的标题栏也是隐藏的状态,良好的用户体验不会在状态栏不显示的时候去显示标题栏。
可以通过对 WindowManager 的标志位设置去实现对状态栏的隐藏。而标志位的设置可以动态的代码控制,也可以通过设置 app manifest 文件中 Activity 的 theme 去实现。如果应用需要一直隐藏状态栏,最好的方式是直接设置的 Theme 在 xml 文件中(当然,严格说来,你照样可以动态的通过代码去覆盖此设置),xml 配置文件如下:
...
使用 xml 配置 Activity theme 去实现的优点:
作为代替,你可以使用代码动态的设置 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 标志位的设置,此标志位会一直存在,直到被应用清除。
同时你可以采用 FLAG_LAYOUT_IN_SCREEN 去设置 activity 布局使用同样的屏幕区域当 FLAG_FULLSCREEN 被使用后,防止应用内容在隐藏和显示状态栏时发生大小变化。
在 Android 4.1 及以上的版本中,我们可以通过使用 setSystemUiVisibility() 去实现状态栏的隐藏。setSystemUiVisibility() 设置 UI 标志位在单独的 view 层级上,这些设置会汇总到 window 层级上。相对于 WindowManager setSystemUiVisibility() 提供了更加细化的控制对于系统栏(状态栏和导航栏)。隐藏状态栏代码如下:
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();
在 Android 4.1 及以上版本中,可以设置应用内容显示在状态栏下,这样应用内容就不会因为状态栏的隐藏或显示而产生大小变化。为了实现这个效果,使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 标志,为了维持稳定的布局效果,应该再增加 SYSTEM_UI_FLAG_LAYOUT_STABLE 标志。
当使用这种方式时,需要你自己去保证应用界面的关键部分(比如地图应用中的控制部分)不会被系统栏遮挡,因为这会让应用不可用。在大多数情况下可以通过往 xml 布局文件中添加 android:fitsSystemWindows 属性并设置为 true 来解决。这样会调整父布局的填充以留出系统栏的位置,能够满足大多数应用的需求。
在有些情况下,或许需要修改默认的父布局填充大小以获取期望的布局,为了直接控制应用内容相对于系统栏的布局,需要重写 fitSystemWindows(Rect insets) 以达到目的。