沉浸式体验二:状态栏

导航

  • 隐藏状态栏
    • 隐藏状态栏在Android 4.0 及以下版本
    • 隐藏状态栏在Android 4.1 及以上
    • 显示内容在状态栏下

隐藏状态栏

有时我们为了获取更大的空间去显示app内容,会对状态栏和导航栏进行隐藏,以达到更好的沉浸式体验。而本文就是对不同android版本上如何隐藏状态栏的描述。

图一,显示了一个状态栏可见的app
沉浸式体验二:状态栏_第1张图片
图一.可见的状态栏

图二,显示了状态栏不可见的app,同时可以发现app的标题栏也是隐藏的状态,良好的用户体验不会在状态栏不显示的时候去显示标题栏。

隐藏状态栏在Android 4.0 及以下版本


可以通过对 WindowManager 的标志位设置去实现对状态栏的隐藏。而标志位的设置可以动态的代码控制,也可以通过设置 app manifest 文件中 Activity 的 theme 去实现。如果应用需要一直隐藏状态栏,最好的方式是直接设置的 Theme 在 xml 文件中(当然,严格说来,你照样可以动态的通过代码去覆盖此设置),xml 配置文件如下:


    ...

使用 xml 配置 Activity theme 去实现的优点:

  • 易于维护并且没有动态配置标志位容易出现配置错误的情况
  • 更加平滑的UI过度,因为系统在初始化 Main Activity 之前就已经获取到渲染UI所需的信息

作为代替,你可以使用代码动态的设置 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 及以上


在 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();
  • 一旦标志位被清除(例如跳转离开当前activity),你需要重新设置标志位如果需要隐藏系统栏的话。响应系统UI变化提供了一种方式去根据系统栏的变化而做出自己的响应。
  • 设置 UI 标志位的位置会产生不同的效果。比如在 activity 的 onCreate() 方法中隐藏系统栏后,用户点击了 Home 键,系统栏就会再次出现,当用户再次打开该 activity 的时候,因为 onCreate() 不会被再次调用,所以系统栏就不会不执行隐藏。如果想要一直保持系统栏的不可见,那就应该在 onResume() 或者 onWidowFocusChange() 中设置 UI 标志位。
  • setSystemUiVisibility() 方法只有当调用该方法的视图 view 可见的时候才会生效。
  • 导航离开该页面会导致该视图 view 通过 setSystemUiVisibility() 设置的标志位被清除。

显示内容在状态栏下

在 Android 4.1 及以上版本中,可以设置应用内容显示在状态栏下,这样应用内容就不会因为状态栏的隐藏或显示而产生大小变化。为了实现这个效果,使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 标志,为了维持稳定的布局效果,应该再增加 SYSTEM_UI_FLAG_LAYOUT_STABLE 标志。

当使用这种方式时,需要你自己去保证应用界面的关键部分(比如地图应用中的控制部分)不会被系统栏遮挡,因为这会让应用不可用。在大多数情况下可以通过往 xml 布局文件中添加 android:fitsSystemWindows 属性并设置为 true 来解决。这样会调整父布局的填充以留出系统栏的位置,能够满足大多数应用的需求。

在有些情况下,或许需要修改默认的父布局填充大小以获取期望的布局,为了直接控制应用内容相对于系统栏的布局,需要重写 fitSystemWindows(Rect insets) 以达到目的。

你可能感兴趣的:(沉浸式体验)