最近要單獨(dú)做一個公司內(nèi)部使用的APP,由于功能點不多,老大讓我自己一個人搞定,這對于剛?cè)肟?轉(zhuǎn)行Android)不到四個月的我來說既是挑戰(zhàn),也是機(jī)遇,因為從架構(gòu)設(shè)計、框架的搭建到具體功能的實現(xiàn)都得自己一個人來完成,這對我是一個很好的鍛煉。
今天來總結(jié)一下Android沉浸式狀態(tài)欄的實現(xiàn),現(xiàn)在越來越多的APP都做成了沉浸式,以前低版本的安卓系統(tǒng)上格格不入的黑色的狀態(tài)欄現(xiàn)在已經(jīng)不多見,目前我們市面上的手機(jī)安卓版本大都在4.4以上了,所以幾乎都可以支持沉浸式狀態(tài)欄,但是目前APP大都還在兼容4.0以上,也有還在兼容2.3和2.2的,其實個人覺得沒有太大的必要了,畢竟2.+已經(jīng)是5年前的版本,很少有手機(jī)有那么長的生命周期。這這以前看了很多關(guān)于解決這個問題的博客,解決方法很多都是分4.4版本到5.0版本和5.1一級以上兩個版本做不同的處理,4.4到5.0都是先將狀態(tài)欄設(shè)置為透明,在創(chuàng)建一個有顏色的狀態(tài)欄填充,5.1以后安卓可以有設(shè)置狀態(tài)欄的方法
activity.getWindow().setStatusBarColor(activity.getResources().getColor(R.color.app_blue));
但是我測試了一下,有些手機(jī)可能由于廠商定制的原因并不起作用,我在小米手機(jī)(米三到米5)測試沒問題,華為手機(jī)如果是5.1的就不行,現(xiàn)在我們統(tǒng)一只管4.4以上版本(沉浸式只有4.4以上支持):
package com.meskal.utils;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
public class StatusBarUtils {
/**
* 設(shè)置status 顏色
*/
public static void setStatusBarColor(Activity activity, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View view = createStatusBarView(activity, color);
if (view != null) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup viewGroup = (ViewGroup) activity.getWindow().getDecorView();
viewGroup.addView(view);
View contentView = ((ViewGroup) activity.getWindow().getDecorView()
.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
if(contentView instanceof ViewGroup){
ViewGroup content = (ViewGroup)contentView;
//這個是為了內(nèi)容不會伸到zh
content.setFitsSystemWindows(true);
content.setClipToPadding(true);
}
}
}
}
/**
* 獲取系統(tǒng)狀態(tài)欄的高度
* @param activity
* @return
*/
private static int getStatusBarHeight(Activity activity) {
int viewHeight = 0;
if (activity != null) {
int resourseId =
activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
viewHeight = activity.getResources().getDimensionPixelSize(resourseId);
}
return viewHeight;
}
/**
* 創(chuàng)建一個view填充狀態(tài)欄
*/
private static View createStatusBarView(Activity activity, int color) {
int viewHeight = getStatusBarHeight(activity);
if (viewHeight == 0) {
return null;
} else {
View view = new View(activity);
ViewGroup.LayoutParams layoutParams =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, viewHeight);
view.setLayoutParams(layoutParams);
view.setBackgroundColor(color);
return view;
}
}
}
最后上一張效果圖(截自開始測試不成功的華為手機(jī)5.1系統(tǒng)):
看到這個圖在吐槽一下華為手機(jī),不僅是狀態(tài)欄,還有那可惡的虛擬鍵,適配真是惡心!