改變狀態列背景顏色和字型顏色(解決因設定白色背景導致系統預設白色字型看不見問題)
阿新 • • 發佈:2019-02-20
因為只有6.0以上的系統才支援狀態列字型顏色的設定,6.0一下的部分手機可通過修改系統原始碼來進行設定如小米,魅族。
import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 狀態列顏色字型設定 * Created by dell on 2016/10/26. */ public class BarTextColorUtils { public static int StatusBarLightMode(Activity activity){ int result=0; //這個方法只支援4.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) {//判斷當前是不是6.0以上的系統 activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); setTranslucentForCoordinatorLayout(activity, 255); result=3; }else {//如果以上都不符合就只能加個半透明的背景色了 result=4; setTranslucentForCoordinatorLayout(activity, 255); } } return result; } //帶有透明顏色的狀態列 public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return; } transparentStatusBar(activity);//先將狀態列設定為完全透明 addTranslucentView(activity, statusBarAlpha);//新增一個自定義透明度的矩形狀態列 } /** * 使狀態列透明 */ @TargetApi(Build.VERSION_CODES.KITKAT) private static void transparentStatusBar(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } else { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } /** * 新增半透明矩形條 * * @param activity 需要設定的 activity * @param statusBarAlpha 透明值 */ private static void addTranslucentView(Activity activity, int statusBarAlpha) { ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (contentView.getChildCount() > 1) { contentView.getChildAt(1).setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0)); } else { //contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha)); } } // // /** // * 建立半透明矩形 View // * // * @param alpha 透明值 // * @return 半透明 View // */ // private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) { // // 繪製一個和狀態列一樣高的矩形 // StatusBarView statusBarView = new StatusBarView(activity); // LinearLayout.LayoutParams params = // new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); // statusBarView.setLayoutParams(params); // statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0)); // return statusBarView; // } /** * 獲取狀態列高度 * * @param context context * @return 狀態列高度 */ private static int getStatusBarHeight(Context context) { // 獲得狀態列高度 int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); return context.getResources().getDimensionPixelSize(resourceId); } /** * 修改小米手機系統的 * @param window * @param dark * @return */ public 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; } /** * 魅族手機修改該字型顏色 * @param window * @param dark * @return */ public 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; } }