Android 状态栏工具——一行代码实现状态栏字体变黑
個人網(wǎng)站
參考了一些文章做了一些修改,變成了自己的工具類。其中有很多地方欠考慮,有待改進,歡迎路過的大佬給點建議。
狀態(tài)欄(一)
狀態(tài)欄(二)
經(jīng)過前兩篇的介紹我們對如何修改狀態(tài)欄的效果有了大致的了解,本篇介紹一種使用更加簡單的方式,可以先拉到最后查看效果圖。
設(shè)置主題效果
注意: 要設(shè)置fitsSystemWindows為true
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="android:fitsSystemWindows">true</item><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>參考SystemBarTint對狀態(tài)欄的改變方式,添加下面這個類方法,用來設(shè)置 API 19 以上的狀態(tài)欄效果
我們的界面繪制時在DecorView中的,這個類的核心思想就是:
1.獲取DecorView
2.繪制狀態(tài)欄高度的View
3.將view添加到DecorView中
所以我們對狀態(tài)欄的操作,其實就是對view的操作。在這個類中默認(rèn)view不顯示,改變狀態(tài)欄的效果時,要調(diào)用
setStatusBarTintEnabled(true)注意:使用這個方法的前提是 狀態(tài)欄是透明的,因為進行了相關(guān)的判斷(可以自行修改)
public class SystemBarTintManager {public static final int DEFAULT_TINT_COLOR = 0x99000000;private boolean mStatusBarAvailable;private boolean mStatusBarTintEnabled;private View mStatusBarTintView;@TargetApi(19)public SystemBarTintManager(Activity activity) {Window win = activity.getWindow();//獲取DecorViewViewGroup decorViewGroup = (ViewGroup) win.getDecorView();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 檢查主題中是否有透明的狀態(tài)欄int[] attrs = {android.R.attr.windowTranslucentStatus};TypedArray a = activity.obtainStyledAttributes(attrs);try {mStatusBarAvailable = a.getBoolean(0, false);} finally {a.recycle();}WindowManager.LayoutParams winParams = win.getAttributes();int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;//狀態(tài)欄透明if ((winParams.flags & bits) != 0) {mStatusBarAvailable = true;}}if (mStatusBarAvailable) {setupStatusBarView(activity, decorViewGroup);}}/*** 初始化狀態(tài)欄** @param context* @param decorViewGroup*/private void setupStatusBarView(Activity context, ViewGroup decorViewGroup) {mStatusBarTintView = new View(context);//設(shè)置高度為Statusbar的高度FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(context));params.gravity = Gravity.TOP;mStatusBarTintView.setLayoutParams(params);mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);//默認(rèn)不顯示mStatusBarTintView.setVisibility(View.GONE);//decorView添加狀態(tài)欄高度的ViewdecorViewGroup.addView(mStatusBarTintView);}/*** 獲取狀態(tài)欄高度** @param activity* @return*/private int getStatusBarHeight(Activity activity) {int statusBarHeight = 0;int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);}return statusBarHeight;}/*** 顯示狀態(tài)欄*/public void setStatusBarTintEnabled(boolean enabled) {mStatusBarTintEnabled = enabled;if (mStatusBarAvailable) {mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);}}/*** 設(shè)置狀態(tài)欄顏色** @param color*/public void setStatusBarTintColor(int color) {if (mStatusBarAvailable) {mStatusBarTintView.setBackgroundColor(color);}} }工具類代碼
在這段代碼中當(dāng)我們的API 為4.4.+ 但是小于 5.0時使用上述的類
/*** 修改狀態(tài)欄顏色,支持4.4以上版本* @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(colorId);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//使用SystemBarTintManager,需要先將狀態(tài)欄設(shè)置為透明setTranslucentStatus(activity);SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);systemBarTintManager.setStatusBarTintEnabled(true);//顯示狀態(tài)欄systemBarTintManager.setStatusBarTintColor(colorId);//設(shè)置狀態(tài)欄顏色}}完整代碼
import android.annotation.TargetApi; import android.app.Activity; import android.graphics.Color; import android.os.Build; import android.support.annotation.IntDef; import android.view.View; import android.view.Window; import android.view.WindowManager;import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** Created by rhm on 2018/1/13.*/public class StatusBarUtil {public final static int TYPE_MIUI = 0;public final static int TYPE_FLYME = 1;public final static int TYPE_M = 3;//6.0@IntDef({TYPE_MIUI,TYPE_FLYME,TYPE_M})@Retention(RetentionPolicy.SOURCE)@interface ViewType {}/*** 修改狀態(tài)欄顏色,支持4.4以上版本* @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(colorId);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//使用SystemBarTintManager,需要先將狀態(tài)欄設(shè)置為透明setTranslucentStatus(activity);SystemBarTintManager systemBarTintManager = new SystemBarTintManager(activity);systemBarTintManager.setStatusBarTintEnabled(true);//顯示狀態(tài)欄systemBarTintManager.setStatusBarTintColor(colorId);//設(shè)置狀態(tài)欄顏色}}/*** 設(shè)置狀態(tài)欄透明*/@TargetApi(19)public static void setTranslucentStatus(Activity activity) {// 5.0以上系統(tǒng)狀態(tài)欄透明if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window window = activity.getWindow();//清除透明狀態(tài)欄window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);//設(shè)置狀態(tài)欄顏色必須添加window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.setStatusBarColor(Color.TRANSPARENT);//設(shè)置透明} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //19activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}}/*** 設(shè)置沉浸式狀態(tài)欄** @param fontIconDark 狀態(tài)欄字體和圖標(biāo)顏色是否為深色*/public static void setImmersiveStatusBar(Activity activity,boolean fontIconDark) {setTranslucentStatus(activity);if (fontIconDark) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setStatusBarFontIconDark(activity,TYPE_M);} else if (OSUtils.isMiui()) {setStatusBarFontIconDark(activity,TYPE_MIUI);} else if (OSUtils.isFlyme()) {setStatusBarFontIconDark(activity,TYPE_FLYME);} else {//其他情況下我們將狀態(tài)欄設(shè)置為灰色,就不會看不見字體setStatusBarColor(activity,Color.LTGRAY);//灰色}}}/*** 設(shè)置文字顏色*/public static void setStatusBarFontIconDark(Activity activity,@ViewType int type) {switch (type) {case TYPE_MIUI:setMiuiUI(activity,true);break;case TYPE_M:setCommonUI(activity);break;case TYPE_FLYME:setFlymeUI(activity,true);break;}}//設(shè)置6.0的字體public static void setCommonUI(Activity activity) {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);}}//設(shè)置Flyme的字體public static void setFlymeUI(Activity activity,boolean dark) {try {Window window = activity.getWindow();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);} catch (Exception e) {e.printStackTrace();}}//設(shè)置MIUI字體public static void setMiuiUI(Activity activity,boolean dark) {try {Window window = activity.getWindow();Class clazz = activity.getWindow().getClass();Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");int darkModeFlag = field.getInt(layoutParams);Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);if (dark) { //狀態(tài)欄亮色且黑色字體extraFlagField.invoke(window, darkModeFlag, darkModeFlag);} else {extraFlagField.invoke(window, 0, darkModeFlag);}} catch (Exception e) {e.printStackTrace();}} }通用方法為
設(shè)置字體顏色為黑色setImmersiveStatusBar(Activity activity,boolean fontIconDark)設(shè)置狀態(tài)欄透明setTranslucentStatus(Activity activity)設(shè)置狀態(tài)欄的顏色setStatusBarColor(Activity activity, int colorId)使用方式
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);StatusBarUtil.setImmersiveStatusBar(this,true);} }第二個參數(shù)是設(shè)置是否為黑色字體。
我們還可以調(diào)用下面代碼設(shè)置狀態(tài)欄顏色。
效果
使用時只需要一行代碼就可以改變狀態(tài)欄的字體顏色,是不是很簡單呢。
請在github上下載完整的內(nèi)容,工具類在statusbarutil中。
參考文章
https://www.jianshu.com/p/932568ed31af
總結(jié)
以上是生活随笔為你收集整理的Android 状态栏工具——一行代码实现状态栏字体变黑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: L39.linux命令每日一练 -- 第
- 下一篇: android sina oauth2.