coordinatelayout android:fitsSystemWindows 沉浸式狀態欄在android4.4 和 4.4以上版本的坑

佈局xml層次:爲了節省空間只寫關鍵代碼

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
  >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <LinearLayout
                android:id="@+id/head_layout">

               《背景》
            </LinearLayout>
            <android.support.v7.widget.Toolbar
                android:id="@+id/tool_bar"
                app:contentInsetLeft="0dp"
                app:contentInsetStart="0dp"
                app:layout_collapseMode="pin">
                <include layout="@layout/activity_title />
            </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>

        <android.support.design.widget.TabLayout
            android:id="@+id/toolbar_tab">

        </android.support.design.widget.TabLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</android.support.design.widget.CoordinatorLayout>

1、首先如果要在4.4版本及其以上版本上使用沉浸式狀態欄,要爲activity配置FLAG_TRANSLUCENT_STATUS,

可以在values中爲主題樣式添加  <item name="android:windowTranslucentStatus">true</item>,

也可以在activity中添加

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//此FLAG可使狀態欄透明,且當前視圖在繪製時,從屏幕頂端開始即top = 0開始繪製,這也是實現沉浸效果的基礎
}
setContentView(R.layout.activity_my_data);
注意:代碼一定要在setContentView之前使用。

2、界面佈局延伸到界面頂部時,你會發現狀態欄會遮蓋“正文”,我們想要的只是背景延伸到頂部,“正文”不向上延伸,那麼我們只需要設法讓“正文”向下挪一個狀態欄高度就可以了。

我們可以在“正文”頂部添加一個view,其高度設置爲狀態欄高度,背景設置爲透明,可以在資源文件中定義高度爲25dp;也可以使用java代碼爲view設置高:
ViewGroup.LayoutParams layoutParams = topview.getLayoutParams();
layoutParams.height = DisplayUtil.getStatusHeightPx(this);
topview.setLayoutParams(layoutParams);
topview.setBackgroundColor(Color.TRANSPARENT);
public static int getStatusHeightPx(Activity act)
{
    int height = 0;
    int resourceId = act.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        height = act.getResources().getDimensionPixelSize(resourceId);
    }
    return height;
}

3.現在爲止我們看一下4.4版本和4.4以上版本的真機調試情況:圖一(左)4.4版本明顯可以看到就是我們想要的結果,但是圖二(右)5.0版本狀態欄並沒有填充。查閱資料要爲“背景”view添加 android:fitsSystemWindows="true"

        

4、在佈局文件中爲“背景”view添加android:fitsSystemWindows="true",我爲toolbar,和headlayout添加了此屬性,但是4.4版本 和5.0版本真機調試效果正好和之前的相反:即上圖圖一(左)是5.0的結果,圖二(右)成了4.4的結果。因此我採用的解決方案是通過java代碼根據版本來判斷是否添加該屬性(當然你也可以設置不同的layout文件)。到此可以勉強實現沉浸式狀態欄的效果。

private void initStateBar() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        ViewGroup.LayoutParams layoutParams = mTopHoldview.getLayoutParams();//titlebarHolder爲添加的頂部的(標題欄上方)佔位控件
        layoutParams.height = DisplayUtil.getStatusHeightPx(this);
        mTopHoldview.setLayoutParams(layoutParams);
        mTopHoldview.setBackgroundColor(Color.TRANSPARENT);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mHeadLayout.setFitsSystemWindows(true);
            mToolBar.setFitsSystemWindows(true);
        }

    }
}

fitSystemWindows屬性: 官方描述: Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity. 簡單描述: 這個一個boolean值的內部屬性,讓view可以根據系統窗口(如status bar)來調整自己的佈局,如果值爲true,就會調整view的paingding屬性來給system windows留出空間.... 實際效果: 當status bar爲透明或半透明時(4.4以上),系統會設置view的paddingTop值爲一個適合的值(status bar的高度)讓view的內容不被上拉到狀態欄,當在不佔據status bar的情況下(4.4以下)會設置paddingTop值爲0(因爲沒有佔據status bar所以不用留出空間)。(摘取自:https://github.com/CoolThink/StatusBarAdapt)

5、由於我是在coordinatelayout 和CollapsingToolbarLayout使用的沉浸式,其中有一個效果就是CollapsingToolbarLayout能夠滾出屏幕,toolbar固定在頂部。但是當CollapsingToolbarLayout滾出後出現了下圖現象,可以看到toolbar和狀態欄重疊,並且下方空白。由於下方空白的高度和狀態欄的高度很相近(你們覺得有沒有?),所以偶就想到是不是fitSystemWindows搞的鬼,我就試着在CollapsingToolbarLayout滾出後將fitSystemWindows設爲false,沒想到解決這個問題了。。我的做法是通過CollapsingToolbarLayout判斷快要滾到toolbar位置的時候將該屬性設爲false,然後其他情況在設爲true,雖然很麻煩,但是最起碼能解決目前的情況。

插一句:由於我是通的toolbar  include佈局,所以要在爲toolbar添加app:contentInsetLeft="0dp" app:contentInsetStart="0dp"屬性,不然你會發現佈局沒有填充toolbar。



參考資料:https://github.com/CoolThink/StatusBarAdapt
http://blog.csdn.net/m075097/article/details/53142391
注:本人還是小白,可能解決方法很二楞,但是目前水平也只能這樣了,輕噴。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章