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