概述
Android 狀態(tài)欄沉浸式基于4.4及以上, Android 系統(tǒng)名字溉知、版本纳寂、API level的對應(yīng)關(guān)系如下:
Code name | Version | Cool |
---|---|---|
Nougat | 7.1 | API level 25 |
Nougat | 7.0 | API level 24 |
Marshmallow | 6.0 | API level 23 |
Lollipop | 5.1 | API level 22 |
Lollipop | 5.0 | API level 21 |
KitKat | 4.4-4.4.4 | API level 19 |
Jelly Bean | 4.3.x | API level 18 |
Jelly Bean | 4.2.x4 | API level 17 |
Jelly Bean | 4.1.x | API level 16 |
所以說只有在kitkat及以上才能實(shí)現(xiàn)沉浸式效果
誘因
前兩天看郭霖的第二行代碼,章節(jié)第十二部分主要是寫了關(guān)于Material Design UI設(shè)計,界面很是炫酷,其中包括DrawerLayout+Toolbar的使用界面很是炫酷,寫的也是通俗易懂,代碼連接,但是本書是基于5.0寫的,所以效果沒有適配到4.4x上.
他的效果代碼截圖:
5.0及以上
4.4及以上
可以到4.4上的效果還是有差別的,下面給出解決方法:
方法有些拙劣,如果有其他更好的解決辦法,請一定告訴我.
- 首先看這張標(biāo)圖效果
這三個顏色,新建工程時都是給出
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
- 在styles里配置
<resources>
<!-- Base application theme. -->
<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme" parent="@style/BaseAppTheme"></style>
</resources>
新建:values-v19和values-v21文件夾,分別在里面創(chuàng)建styles文件,分別配置
values-v19
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="BaseAppTheme">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:fitsSystemWindows">false</item>
</style>
<style name="fitsystem">
<item name="android:fitsSystemWindows">true</item>
</style>
</resources>
values-v21
<resources>
<style name="AppTheme" parent="BaseAppTheme">
</style>
</resources>
為什么要這么配置呢,因?yàn)楸纠佑玫搅?strong>CoordinatorLayout,AppBarLayout,Toolar,所以要單獨(dú)對對Toolbar做處理,看代碼:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/fitsystem"
android:layout_width="match_parent"
android:layout_height="@dimen/toolBarheight"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swip_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_done" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header"
app:menu="@menu/nav_menu" />
</android.support.v4.widget.DrawerLayout>
可以看到在在Toolbar里讓布局在v19里是
<style name="fitsystem">
<item name="android:fitsSystemWindows">true</item>
</style>
同樣的道理這個時候Toolbar的高,也要出處理,在v19里面要設(shè)置更高些,因?yàn)樗靡徊糠质乔度氲綘顟B(tài)里面的
所以在values values-v19 values-v21都設(shè)置了Toolbar的高度,在19里單獨(dú)設(shè)置了80dp ,其他的都是54,這個值可以自己來衡量
- 在代碼里面要重新處理4.4x情況如下:
Activity
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
StatusBarCompat.compat(this);
這里如果是在4.4上就要另外添加一個顏色塊到狀態(tài)欄
public class StatusBarCompat {
private static final int statusColor = Color.parseColor("#303F9F");
public static void compat(Activity activity ) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
View statusBarView = contentView.getChildAt(0);
//改變顏色時避免重復(fù)添加statusBarView
if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) {
statusBarView.setBackgroundColor(statusColor);
return;
}
statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setBackgroundColor(statusColor);
contentView.addView(statusBarView, lp);
}
}
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
- 下面來看看效果
5.0及以上
4.4及以上
可以看到效果就OK了,然后我有測試了7.0效果也是OK的.文筆稍差.
總結(jié)
當(dāng)然了可能你把這個用到你的項(xiàng)目可能會發(fā)現(xiàn)有些問題,因?yàn)楸疚氖轻槍卮a處理的,盡可能最小的改動達(dá)到效果.要特別注意在v19里
<item name="android:fitsSystemWindows">true</item>
這個要配合代碼布局文件使用,要根據(jù)自己的項(xiàng)目布局去處理,如這篇文章家杰的博客
本文參考了鴻洋的經(jīng)典文章
這是我的代碼,錯誤或有更好的方法請告訴我.