Android修改狀態(tài)欄的背景顏色

一,概述

我相信很多初入Android開發(fā)的開發(fā)者都為自己開發(fā)的app的狀態(tài)欄煩惱過,狀態(tài)欄和自己的界面風格格格不入,但是不知道如何修改這個狀態(tài)欄的顏色,感覺無從下手.我最近就是被這個狀態(tài)的默認風格搞得焦頭爛額,終于找到了相應的解決辦法.雖然代碼不是我寫的,我也只能看懂一部分代碼,但這又有什么關(guān)系呢?我們這些熱愛Java語言的人,在看不懂別人代碼的情況下,只要會面向?qū)ο缶托辛?所有我就直接把找到的代碼當成一個工具類,用著真舒服,在此就謝謝那個(或者那些)無名大神了.

二,狀態(tài)欄工具類

這個狀態(tài)欄工具類StatusBarUtil對MIUI flyme及安卓版本做了適配,代碼量也挺多的,接近200行.我嘗試看了一下代碼,看不懂,然后看了它的方法說明,就大概知道它的作用了(感謝會寫注釋說明的大神).也不多說,直接上代碼.(再次聲明,這份代碼來自某位或某些無名大神).

package com.bighuan.okhttpdemo.utils.statusbar;  
  
import android.annotation.TargetApi;  
import android.app.Activity;  
import android.graphics.Color;  
import android.os.Build;  
import android.view.View;  
import android.view.Window;  
import android.view.WindowManager;  
  
import com.readystatesoftware.systembartint.SystemBarTintManager;  
  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
  
/** 
 * 用來管理手機狀態(tài)欄一系列操作朦蕴,主要是就Window類的使用 
 */  
  
public class StatusBarUtil {  
  
    /** 
     * 修改狀態(tài)欄為全透明 
     * 
     * @param activity 
     */  
    @TargetApi(19)  
    public static void transparencyBar(Activity activity) {  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
            Window window = activity.getWindow();  
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS  
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);  
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);  
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);  
            //api21新增接口  
            window.setStatusBarColor(Color.TRANSPARENT);  
            window.setNavigationBarColor(Color.TRANSPARENT);  
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
            Window window = activity.getWindow();  
            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,  
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);  
        }  
    }  
  
    /** 
     * 修改狀態(tài)欄顏色窒百,支持4.4以上版本 
     * 
     * @param activity 
     * @param colorId 
     */  
    public static void setStatusBarColor(Activity activity, int colorId) {  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  
            Window window = activity.getWindow();  
            window.setStatusBarColor(activity.getResources().getColor(colorId));  
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
            //使用SystemBarTint庫使4.4版本狀態(tài)欄變色捌蚊,需要先將狀態(tài)欄設置為透明  
            transparencyBar(activity);  
            SystemBarTintManager tintManager = new SystemBarTintManager(activity);  
            tintManager.setStatusBarTintEnabled(true);  
            tintManager.setStatusBarTintResource(colorId);  
        }  
    }  
  
    /** 
     * 設置狀態(tài)欄黑色字體圖標, 
     * 適配4.4以上版本MIUIV浩考、Flyme和6.0以上版本其他Android 
     * 
     * @param activity 
     * @return 1:MIUUI 2:Flyme 3:android6.0 
     */  
    public static int statusBarLightMode(Activity activity) {  
        int result = 0;  
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {  
            if (MIUISetStatusBarLightMode(activity.getWindow(), true)) {  
                result = 1;  
            } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {  
                result = 2;  
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
                activity.getWindow().getDecorView().  
                        setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
                                | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);  
                result = 3;  
            }  
        }  
        return result;  
    }  
  
    /** 
     * 已知系統(tǒng)類型時,設置狀態(tài)欄黑色字體圖標。 
     * 適配4.4以上版本MIUIV樊销、Flyme和6.0以上版本其他Android 
     * 
     * @param activity 
     * @param type     1:MIUUI 2:Flyme 3:android6.0 
     */  
    public static void statusBarLightMode(Activity activity, int type) {  
        if (type == 1) {  
            MIUISetStatusBarLightMode(activity.getWindow(), true);  
        } else if (type == 2) {  
            FlymeSetStatusBarLightMode(activity.getWindow(), true);  
        } else if (type == 3) {  
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);  
        }  
  
    }  
  
    /** 
     * 清除MIUI或flyme或6.0以上版本狀態(tài)欄黑色字體 
     */  
    public static void statusBarDarkMode(Activity activity, int type) {  
        if (type == 1) {  
            MIUISetStatusBarLightMode(activity.getWindow(), false);  
        } else if (type == 2) {  
            FlymeSetStatusBarLightMode(activity.getWindow(), false);  
        } else if (type == 3) {  
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);  
        }  
  
    }  
  
  
    /** 
     * 設置狀態(tài)欄圖標為深色和魅族特定的文字風格 
     * 可以用來判斷是否為Flyme用戶 
     * 
     * @param window 需要設置的窗口 
     * @param dark   是否把狀態(tài)欄字體及圖標顏色設置為深色 
     * @return boolean 成功執(zhí)行返回true 
     */  
    private static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {  
        boolean result = false;  
        if (window != null) {  
            try {  
                WindowManager.LayoutParams lp = window.getAttributes();  
                Field darkFlag = WindowManager.LayoutParams.class  
                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");  
                Field meizuFlags = WindowManager.LayoutParams.class  
                        .getDeclaredField("meizuFlags");  
                darkFlag.setAccessible(true);  
                meizuFlags.setAccessible(true);  
                int bit = darkFlag.getInt(null);  
                int value = meizuFlags.getInt(lp);  
                if (dark) {  
                    value |= bit;  
                } else {  
                    value &= ~bit;  
                }  
                meizuFlags.setInt(lp, value);  
                window.setAttributes(lp);  
                result = true;  
            } catch (Exception e) {  
  
            }  
        }  
        return result;  
    }  
  
    /** 
     * 設置狀態(tài)欄字體圖標為深色饵蒂,需要MIUIV6以上 
     * 
     * @param window 需要設置的窗口 
     * @param dark   是否把狀態(tài)欄字體及圖標顏色設置為深色 
     * @return boolean 成功執(zhí)行返回true 
     */  
    private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {  
        boolean result = false;  
        if (window != null) {  
            Class clazz = window.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);  
                if (dark) {  
                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//狀態(tài)欄透明且黑色字體  
                } else {  
                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體  
                }  
                result = true;  
            } catch (Exception e) {  
  
            }  
        }  
        return result;  
    }  
}  

直接將這個工具類導入AS項目中是會報錯的,因為這個工具類也是基于一個開源項目的.我通過報錯的代碼,找啊找,馬上就在github上找到了,就是這個開源項目SystemBarTint.這個項目雖然已經(jīng)顯示廢棄不再維護了,但是好像還是很多人在用.那我當然也用了.

三,導入開源項目

在AS項目的app目錄下的build.gradle文件的dependencies閉包中,添加如下這行代碼,同步后就可以使用SystemBarTint這個項目了.或者在網(wǎng)上搜声诸,都有的。

compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' 


工具類中的那幾個方法的作用一看就懂,我討厭默認的狀態(tài)欄效果,就在自己寫的Activity基類的onCreate()方法中添加了如下一行代碼:

//將狀態(tài)欄設置為綠色:#38B059  
       changeStatusBarColor(R.color.myColor_green);

我將狀態(tài)欄設置成#38B059,后面子類如果繼承Activity基類,狀態(tài)欄就統(tǒng)統(tǒng)都是那個綠色了.如果頁面有actionbar,我們將actionbar也設置成#38B059,一體感是不是很強啊!?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苹享,一起剝皮案震驚了整個濱河市双絮,隨后出現(xiàn)的幾起案子浴麻,更是在濱河造成了極大的恐慌,老刑警劉巖囤攀,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件软免,死亡現(xiàn)場離奇詭異,居然都是意外死亡焚挠,警方通過查閱死者的電腦和手機膏萧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝌衔,“玉大人榛泛,你說我怎么就攤上這事∝澹” “怎么了曹锨?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剃允。 經(jīng)常有香客問我沛简,道長,這世上最難降的妖魔是什么斥废? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任椒楣,我火速辦了婚禮,結(jié)果婚禮上牡肉,老公的妹妹穿的比我還像新娘捧灰。我一直安慰自己,他們只是感情好统锤,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布毛俏。 她就那樣靜靜地躺著,像睡著了一般跪另。 火紅的嫁衣襯著肌膚如雪拧抖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天免绿,我揣著相機與錄音唧席,去河邊找鬼。 笑死嘲驾,一個胖子當著我的面吹牛淌哟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辽故,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼徒仓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誊垢?” 一聲冷哼從身側(cè)響起掉弛,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤症见,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殃饿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谋作,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年乎芳,在試婚紗的時候發(fā)現(xiàn)自己被綠了遵蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡奈惑,死狀恐怖吭净,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肴甸,我是刑警寧澤寂殉,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站原在,受9級特大地震影響不撑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晤斩,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姆坚。 院中可真熱鬧澳泵,春花似錦、人聲如沸兼呵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽击喂。三九已至维苔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂昂,已是汗流浹背介时。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凌彬,地道東北人沸柔。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像铲敛,于是被迫代替她去往敵國和親褐澎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,332評論 25 707
  • 太長了伐蒋,還是轉(zhuǎn)載吧...今天在看博客的時候工三,無意中發(fā)現(xiàn)了@Trinea在GitHub上的一個項目Android開源...
    龐哈哈哈12138閱讀 20,218評論 3 283
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程迁酸,因...
    小菜c閱讀 6,451評論 0 17
  • 從上周開始,我整個人感覺很累俭正,很不舒服奸鬓,有點咳嗽。 和我一起咳嗽的還有夏同學段审、我老公全蝶。 12月上旬太累了,感覺是透...
    lindacui閱讀 260評論 0 0