Android修改狀態列的背景顏色
一,概述
我相信很多初入Android開發的開發者都為自己開發的app的狀態列煩惱過,狀態列和自己的介面風格格格不入,但是不知道如何修改這個狀態列的顏色,感覺無從下手.我最近就是被這個狀態的預設風格搞得焦頭爛額,終於找到了相應的解決辦法.雖然程式碼不是我寫的,我也只能看懂一部分程式碼,但這又有什麼關係呢?我們這些熱愛Java語言的人,在看不懂別人程式碼的情況下,只要會面向物件就行了.所有我就直接把找到的程式碼當成一個工具類,用著真舒服,在此就謝謝那個(或者那些)無名大神了.
二,狀態列工具類
這個狀態列工具類StatusBarUtil對MIUI flyme及安卓版本做了適配,程式碼量也挺多的,接近200行.我嘗試看了一下程式碼,看不懂,然後看了它的方法說明,就大概知道它的作用了(感謝會寫註釋說明的大神).也不多說,直接上程式碼.(再次宣告,這份程式碼來自某位或某些無名大神).
直接將這個工具類匯入AS專案中是會報錯的,因為這個工具類也是基於一個開源專案的.我通過報錯的程式碼,找啊找,馬上就在github上找到了,就是這個開源專案SystemBarTint.這個專案雖然已經顯示廢棄不再維護了,但是好像還是很多人在用.那我當然也用了.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; /** * 用來管理手機狀態列一系列操作,主要是就Window類的使用 */ public class StatusBarUtil { /** * 修改狀態列為全透明 * * @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); } } /** * 修改狀態列顏色,支援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版本狀態列變色,需要先將狀態列設定為透明 transparencyBar(activity); SystemBarTintManager tintManager = new SystemBarTintManager(activity); tintManager.setStatusBarTintEnabled(true); tintManager.setStatusBarTintResource(colorId); } } /** * 設定狀態列黑色字型圖示, * 適配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; } /** * 已知系統型別時,設定狀態列黑色字型圖示。 * 適配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以上版本狀態列黑色字型 */ 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); } } /** * 設定狀態列圖示為深色和魅族特定的文字風格 * 可以用來判斷是否為Flyme使用者 * * @param window 需要設定的視窗 * @param dark 是否把狀態列字型及圖示顏色設定為深色 * @return boolean 成功執行返回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; } /** * 設定狀態列字型圖示為深色,需要MIUIV6以上 * * @param window 需要設定的視窗 * @param dark 是否把狀態列字型及圖示顏色設定為深色 * @return boolean 成功執行返回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);//狀態列透明且黑色字型 } else { extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字型 } result = true; } catch (Exception e) { } } return result; } }
三,匯入開源專案
在AS專案的app目錄下的build.gradle檔案的dependencies閉包中,新增如下這行程式碼,同步後就可以使用SystemBarTint這個專案了.
compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
工具類中的那幾個方法的作用一看就懂,我討厭預設的狀態列效果,就在自己寫的Activity基類的onCreate()方法中添加了如下一行程式碼:
R.color.myColor_green就是我在color檔案中宣告的一個顏色,就是#38B059了.看個效果唄://將狀態列設定為綠色:#38B059 changeStatusBarColor(R.color.myColor_green);
我將狀態列設定成#38B059,後面子類如果繼承Activity基類,狀態列就統統都是那個綠色了.如果頁面有actionbar,我們將actionbar也設定成#38B059,一體感是不是很強啊!?
四,總結
Android最大的魅力就是開源了,這句話確實一點都沒錯.也是得益於這種開源思想,很多大神無私的將程式碼分享出來,幫助無數開發者,真的是太感謝了.今天寫這篇部落格可能就是加深一下記憶吧,順便做一個個人筆記.好了,本文到此結束,下篇部落格見!
相關推薦
Android實現修改狀態列背景、字型和圖示顏色的方法
前言: Android開發,對於狀態列的修改,實在是不友好,沒什麼api可以用,不像ios那麼方便.但是ui又喜歡只搞ios一套.沒辦法.各種翻原始碼,寫反射.真的蛋疼. 需求場景: 當toolbar及狀態列需要為白色或淺色時(如簡書),狀態列由於用的Light風格Theme,字型,
Android修改狀態列的背景顏色
一,概述 我相信很多初入Android開發的開發者都為自己開發的app的狀態列煩惱過,狀態列和自己的介面風格格格不入,但是不知道如何修改這個狀態列的顏色,感覺無從下手.我最近就是被這個狀態的預設風格搞得焦頭爛額,終於找到了相應的解決辦法.雖然程式碼不是我寫的,我也只能看懂一
React native:(StatusBar)修改狀態列背景及文字顏色
在自定義導航欄得時候,狀態列得背景顏色和狀態列得顏色是不統一得,看起來很不協調,RN中文網找到了StatusBar,可以設定狀態列。https://reactnative.cn/docs/statusbar.html#docsNav 首先我定義了一些屬性得約束,狀態列只用到
Recat native:(StatusBar)修改狀態列背景及文字顏色
首先我定義了一些屬性得約束,狀態列只用到了:statusBar: PropTypes.shape(StatusBarShape) static propTypes={ tit
Android中修改狀態列的顏色和我們App的風格一樣
就是自定義一個主題: <resources> <!-- Base application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <!-- Customiz
Android修改狀態列顏色
最近公司的專案,要求統一狀態列,做了之後在別的手機上都完美適配。但在華為mate10pro上卻成了介個樣子。試了好多種方法無果後,最終找到了以下介個工具類,有遇到相同問題的童鞋可以參考哦!public class StatusBarUtil { public stati
小程式——動態修改狀態列文字顏色/背景/動畫及頁面樣式
初次開發小程式,很多東西都是一邊百度一邊摸索學習,這幾天收穫還是很大的。 小程式API真的應該好好地去學習一遍吶,熟悉API的屬性,再百度各位前輩大佬的例子,那就很容易上手了。 現在又開始學習了,感覺很不錯,每天進步一點點也是好的。 .wxml: <vie
android 修改狀態列顏色
android狀態列顏色修改 狀態列顏色的修改在4.4和5.x環境下分別有不同的方式,低於4.4以下是不能修改的。 5.x環境下 方式一,狀態列將顯示為純淨的顏色,沒有漸變效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Android 修改狀態列(狀態列為view的圖片的一部分)①
Android 修改狀態列,讓狀態列和佈局中view的第一個圖片重合 效果圖如下: 這個效果完全可以用style來達到效果 下面是根據stysle來改動 在res下新建一個values-v19 新建styles.xml <?xml version="1.
Android 修改狀態列和沉浸式佈局總結
不多說獻上工具類。package com.yazhi1992.practice.immersion_status_bar; import android.app.Activity; import android.content.Context; import android
簡單記錄,設定一體化狀態列背景顏色的方法
/** * 設定一體化狀態列顏色 * @param activity * @param color 狀態列顏色 */ public static void setStatusBarTint(Activity activity
android 設定狀態列的顏色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarC
iOS7修改狀態列文字顏色
iOS7預設狀態列文字顏色為黑色 修改為白色的方法: 1在Info.plist中設定UIViewControllerBasedStatusBarAppearance 為NO 2 在需要改變狀態列顏色的ViewController中在ViewDidLoad方法中
修改狀態列文字顏色?
Android 6.0 以上系統才可以把狀態列文字和圖示換成深色 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLA
android 改變狀態列字型顏色和圖示顏色和沉浸式
設定沉浸式狀態列protected boolean useThemestatusBarColor = false;//是否使用特殊的標題欄背景顏色,android5.0以上可以設定狀態列背景色,如果不使用則使用透明色值 protected boolean useSta
改變狀態列背景顏色和字型顏色(解決因設定白色背景導致系統預設白色字型看不見問題)
因為只有6.0以上的系統才支援狀態列字型顏色的設定,6.0一下的部分手機可通過修改系統原始碼來進行設定如小米,魅族。import android.annotation.TargetApi; import android.app.Activity; import android
Android 沉浸式狀態列-字型顏色與背景顏色修改實現與相容
沉浸式狀態列究其根本就是將佈局內容延伸到狀態列中,讓狀態列覆蓋在佈局上或者隱藏。 實現 首先,要修改狀態列android版本至少要在4.4以上,並且在4.4是不能讓狀態列透明的,只能達到一種半透明的陰影背景,而在5.x的版本中,是可以修改背景顏色但無法修
nativescript修改android的狀態列顏色
if (app.android && Platform.device.sdkVersion >= '21') { let window = app.android.startActivity.getWindow(); window.setStatusBarCo
Android改變狀態列的背景顏色使其與APP風格一體化
我相信大家肯定看到過很多軟體有沉浸式狀態列,在執行該App時改變了手機螢幕頂部狀態列的顏色,使他們的風格非常的統一,看起來異常的漂亮和清爽。想不想實現這種效果呢,其實在Android KITKAT上有一個新的特性可以設定手機狀態列的背景,讓手機整個介面的風格保持一致,看起來
android系統修改狀態列背景色以及文字顏色
修改狀態列的顏色一般是android系統5.1以上才支援,程式碼如下 activity.getWindow().setStatusBarColor(activity.getResources().getColor(R.color.custom_status_bar_c