探索 單個Fragment實現沉浸式,其餘Fragment不實現的解決辦法

風清袖一發表於2018-03-08

需求

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

相關文章