在Android4.4之後開始支持沉浸式狀態欄,如下圖
(1)起初Android4.4(API19)開始實現沉浸式狀態欄
自從Android4.4之後,Android開始支持沉浸式狀態欄,實現方式有兩種
-
設置
FLAG_TRANSLUCENT_STATUS
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
-
在主題中添加屬性
<item name="android:windowTranslucentStatus">true</item>
在4.4手機中的效果如下(左圖黑色的狀態欄沒有消失,右圖已經實現了沉浸式效果)
在5.0和8.0手機的效果如下(左圖和右圖都有灰色的陰影)
經過多重機型的測試,我們發現並不是所有的手機都能完美實現沉浸式效果的狀態欄。
(2)Android5.0以後,解決狀態欄灰色陰影的問題
代碼如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(getResources().getColor(android.R.color.holo_red_light));
}
或者設置主題
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
Android5.0和Android8.0的效果如下:
(3)Android6.0以後支持修改狀態欄圖片的顏色
//設置狀態欄圖標顏色爲淺黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
或者在主題中添加
<item name="android:windowLightStatusBar">true</item>
(4)適配建議
前面三點基本已經算是各版本適配的全部了,爲了更好的完善適配問題,還是不要使用主題的好,因爲這樣看起來很亂,可讀性差。
這裏推薦使用純代碼適配
。
(5)純色適配
純色適配相對比較簡單,下圖就是效果
代碼實現分兩步:
1.設置fitsSystemWindows爲true,比如標題欄使用Toolbar,那麼就用Toolbar設置fitsSystemWindows爲true;
2.添加以下代碼:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/statusbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:text="標題"
android:layout_gravity="center_horizontal"
android:textSize="20sp"/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
//設置狀態欄圖標顏色爲淺黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
//修改狀態欄顏色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary));
}else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//Android4.4以上手機-頂部狀態欄透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//Android4.4以上手機-底部導航欄透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
(6)圖片適配
圖片適配的效果如下
由於我們需要做到圖片延伸到屏幕頂端的效果,所以就不能設置fitsSystemWindows爲true了。
代碼如下:
//設置狀態欄圖標顏色爲淺黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//注意要清除 FLAG_TRANSLUCENT_STATUS flag
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//Android4.4以上手機-頂部狀態欄透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//Android4.4以上手機-底部導航欄透明
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
但是,部分5.0以上的手機狀態欄有陰影,目前沒有什麼好的辦法解決,5.0新增的setStatusBarColor在這種情況也不太適合。
(7)三方庫
網上三方庫還是比較多的,android4.4以上沉浸式狀態欄和導航欄實現以及Bar的其他管理這個三方庫還是比較推薦使用的。