探索 单个Fragment实现沉浸式,其余Fragment不实现的解决办法

需求

MainActivity中包含五个Fragment,但是只要求HomeFragment实现沉浸式,其余Fragment不实现沉浸式,保持原来的模样

注意:仅Android21及其以上系统支持

思路

前提:沉浸式只能作用在Activity上!

思路1

思路步骤

  1. 使MainAcitivity实现沉浸式,此时所有Fragment页面都将实现沉浸式;
  2. 为每一个Fragment页面新增一个View,此处需要注意布局方式(FrameLayout布局可能比较难处理);
  3. 为每一个Fragment实现新增View的高度和背景色。

实现步骤

1、使MainAcitivity实现沉浸式:

StatusBarUtil.setStatusBarTransparent(activity);

2、 为每一个不需要实现沉浸式的Fragment页面新增一个View:

<View
    android:id="@+id/view_status_bar"
    android:layout_width="match_parent"
    android:layout_height="0dp"/>

3、为每一个不需要实现沉浸式的Fragment实现新增View的高度和背景色:

StatusBarUtil.setStatusViewAttr(view, activity);

优缺点

  • 优点:可控性高;并且在布局文件中静态实现了高度和背景色,不需要实时计算(此点相对于 思路2 而言)。
  • 弊端:需要给每个不想实现沉浸式的Fragment页面新增多余且相似的代码。

思路2

思路步骤

  1. 使MainAcitivity实现沉浸式,此时所有Fragment页面都将实现沉浸式;
  2. 获得DecorView之后,动态的为其子View设置topMargin,实现Fragment页面切换时沉浸

实现步骤

1、使MainAcitivity实现沉浸式:

StatusBarUtil.setStatusBarTransparent(activity);

2、使默认第一个显示的Fragment页面实现沉浸式:

StatusBarUtil.createStatusView(activity);
StatusBarUtil.hideStatusView(activity, true);

3、使其它Fragment不实现沉浸式,在实现沉浸式效果的Fragment中加入下面代码:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        StatusBarUtil.hideStatusView(activity, false);
    } else {
        StatusBarUtil.hideStatusView(activity, true);
    }
}

优缺点

  • 优点:可集成为一个工具类,不需要在Fragment中新增代码。
  • 弊端:需要变化topMargin的值,导致页面有细微的滑动。

思路3

还在搜索中......

源码

StatusBar

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,142评论 25 708
  • 如果你从这篇文章中看到了你的影子,别太在意,我不是在写你,但又有可能在写你。 天暗了下来,是回家的时间了,我特意没...
    解忧少年阅读 529评论 11 7
  • 这是写给你的第一封信 写这封信之前我想了好多 想到很多刚开始的点滴 想到很多你给我的那些温柔 嘴角又不由自主就上扬...
    晚安婉安阅读 334评论 0 0
  • 耳总是一只鹦鹉 在路边被带回来 墨绿色的外衣衬得它气宇轩昂 啄破好几个纸箱 仍旧换来铁笼的禁锢 热心的少年给了它一...
    吴爪爪阅读 317评论 0 0