Android 沉浸式狀態欄的苦逼之旅

Android 沉浸式狀態欄的苦逼之旅,先說一下基本設定
1、values-v21

2、values-v19

true

狀況一

開發完程序用同事的小米手機測試(⊙o⊙),突然發現白色狀態欄,白色字體(⊙﹏⊙)b,這TM的能看嗎,於是就有瞭下面的代碼

//處理狀態欄,小米
public static void setStatusBarDarkMode(boolean darkmode, Activity activity) {
    Class clazz = activity.getWindow().getClass();
    try {
        int darkModeFlag = 0;
        Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
        Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
        darkModeFlag = field.getInt(layoutParams);
        Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
        extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
        } catch (Exception e) {
            e.printStackTrace();
        }
}

然後BaseActivity中的onCreate中setStatusBarDarkMode(true, this);一下,好瞭字體變黑瞭,既然字體可變瞭,那麼就該改狀態欄,先上一張圖
這裡寫圖片描述
這是Android5.0的效果圖,所以我們經常看到剛創建的工程裡面有這樣的代碼


    @color/colorPrimary
    @color/colorPrimaryDark
    @color/colorAccent

恩,我們要修改statusBarColor,然而4.4-5.0沒法直接改狀態欄顏色,折中辦法
1、狀態欄變半透明,沒錯就是上面values-v19的設置

true

2、在狀態欄上加一個佈局

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT <                     Build.VERSION_CODES.LOLLIPOP)
{
    int color = COLOR_DEFAULT;
    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    if (statusColor != INVALID_VAL)
    {
        color = statusColor;
    }
    View statusBarView = new View(activity);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
    //可以是資源,我這是漸變的,像QQ一樣
    statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
    //可以是具體的顏色,反正View能設置的都想
    //statusBarView.setBackgroundColor(color);
    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;
}

以上就是4.4-5.0狀態欄的設置方法

5.0以後的

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
    if (statusColor != INVALID_VAL)
    {
       //透明狀態欄,也就是不能要values-v19中主題的方法
       activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
       //需要設置這個 flag 才能調用 setStatusBarColor 來設置狀態欄顏
       activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
       activity.getWindow().setStatusBarColor(statusColor);   
    }      
}

好瞭,在BaseActivity裡面onCreate使用,比如StatusBarCompat.compat(this, R.color.blue);

狀況二

打開我自己的紅米手機(不好意思用同事的),一臉悶逼之狀態欄沒變色,然後看一下系統版本5.0的,沒問題啊,然後我將百度翻爛瞭沒找到原因,而在另一臺華為4.4上都是可以的。最後還是在寫佈局的時候忘加入android:fitsSystemWindows=”true”發現狀態欄根本不是透明的,就是白的…

狀況三

我不想用自己的手機測試瞭,就創建瞭個模擬器(Android7.0),什麼,狀態欄又沒變色%>_<%,經過測試,狀態欄是半透明的,其他軟件狀態欄是變色的,好吧我發大招瞭,我的終極代碼

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void compat(Activity activity, int statusColor)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (statusColor != INVALID_VAL)
        {
            int color = COLOR_DEFAULT;
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            if (statusColor != INVALID_VAL)
            {
                color = statusColor;
            }
            View statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
            contentView.addView(statusBarView, lp);
        }
     }

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
     {
         int color = COLOR_DEFAULT;
         ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
         if (statusColor != INVALID_VAL)
         {
             color = statusColor;
         }
         View statusBarView = new View(activity);
         ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
         statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
         contentView.addView(statusBarView, lp);
     }

}

好吧上下一樣,由於公司可測試手機不多(他們都用蘋果),也沒找到集體原因,以上方法應該可以應對4.4以上所有方法

You May Also Like