Android: 自定义 View 以沉浸状态栏在 4.4- 的兼容

  注意:这并不是 4.4- 下的沉浸状态栏解决方案,目前 4.4- 没有 API 实现透明或沉浸状态栏,仅作为一次日常记录。

  从 4.4 (API 19) 开始,可以通过设置 Window Flag 或对 Activity 的根布局设置 fitsSystemWindows 属性来透明 / 沉浸状态栏。大多数情况下,透明任务栏会使布局往上顶,而增加占位符不是在什么时候都有用的 (比如实现状态栏到标题栏范围内的高斯模糊或统一非纯色背景。效果可以参照 iOS 的标题栏)。
  可以理解成这种效果:


  这是一个自定义 View,上边空出状态栏的高度,内容置底。这在 4.4+ 上非常好用,不用担心其它沉浸方法的绝大多数坑。但是如果你的 APP 需要兼容 4.4-,上边预留的位置会顶下来,造成标题栏过高的效果。
  就像这样:


▲ 现在在做的项目已经解决了这个问题,所以拿以前的截图凑合一下。


  此时可以在你的自定义 View 中,判断 API 版本来缩小整个 View 的高度。假设使用的 ViewGroup 是 RelativeLayout:

// 针对 4.4- 的沉浸标题栏处理
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp.height = (int) (50 * getResources().getDisplayMetrics().density + 0.5f);
    lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
    rlTitleBar.setLayoutParams(lp);
}

  50dp 是我的 View 所支持的最小高度。实际使用时,需按自己的需要进行调整。
  最终在 4.2 上的效果: