該方法只對部分Android6.0以下的手機有效,(顏色可以成功修改),無效的情況是導航欄半透明狀態,可以看到字體,
Android沉浸式導航欄很普遍,可以讓狀態欄和手機自帶的標題欄“融為一體”,看上去更為美觀,但如果UI給的設計圖,標題欄是白色,剛好你手機狀態欄字體顏色也是白色,會導致看不見導航欄字體,如圖:

對于這種情況,有小伙伴說了,MIUI和Flyme提供了開源代碼設定狀態欄的字體顏色,就像咱們搜索“Android改變標題欄字體顏色”后,出來的千篇一律的“StatusBarUtil”類一樣,這個類確實對Android6.0的手機有用,
但是低版本手機呢?咱們先看一下這個類吧:
package com.matai.sharecar.utils;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 作者: www on 2019/8/27.
* 類說明:
*/
public class StatusBarUtil3 {
private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
/**
* 設定狀態欄文字色值為深色調
*
* @param useDart 是否使用深色調
* @param activity
*/
public static void setStatusTextColor(boolean useDart, Activity activity) {
if (isFlyme()) {//判斷是否是魅族
processFlyMe(useDart, activity);//呼叫Flyme開源代碼
} else if (isMIUI()) {//判斷是否是小米
processMIUI(useDart, activity);//呼叫MIUI開源代碼
} else {//兩者均不是
if (useDart) {//如果設定了深色調
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);
}else{
//當不滿足以上條件時,沒有處理!!!!!
}
} else {//沒有設定深色調
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
/**
* 判斷手機是否是魅族
*
* @return
*/
public static boolean isFlyme() {
try {
// Invoke Build.hasSmartBar()
final Method method = Build.class.getMethod("hasSmartBar");
return method != null;
} catch (final Exception e) {
return false;
}
}
/**
* 改變魅族的狀態欄字體為黑色,要求FlyMe4以上
*/
private static void processFlyMe(boolean isLightStatusBar, Activity activity) {
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
try {
Class<?> instance = Class.forName("android.view.WindowManager$LayoutParams");
int value = https://www.cnblogs.com/yunfang/p/instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp);
Field field = instance.getDeclaredField("meizuFlags");
field.setAccessible(true);
int origin = field.getInt(lp);
if (isLightStatusBar) {
field.set(lp, origin | value);
} else {
field.set(lp, (~value) & origin);
}
} catch (Exception ignored) {
ignored.printStackTrace();
}
}
/**
* 判斷手機是否是小米
*
* @return
*/
public static boolean isMIUI() {
try {
final BuildProperties prop = BuildProperties.newInstance();
return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
|| prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
|| prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}
/**
* 改變小米的狀態欄字體顏色為黑色, 要求MIUI6以上 lightStatusBar為真時表示黑色字體
*/
private static void processMIUI(boolean lightStatusBar, Activity activity) {
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
int darkModeFlag;
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(), lightStatusBar? darkModeFlag : 0, darkModeFlag);
} catch (Exception ignored) {
ignored.printStackTrace();
}
}
}
代碼含義在注釋中已經很詳細了,使用方法是在MainActivity中:StatusBarUtil.setStatusTextColor(true,this);
效果如圖:

但是在我的測驗機上(vivo Android5.1)并沒有修改成功……于是在網上找Funtouch OS系統怎么修改標題欄顏色,找到了這個方法:
/**
* 設定OPPO手機狀態欄字體為黑色(colorOS3.0,6.0以下部分手機)
*
* @param lightStatusBar
* @param activity
*/
private static final int SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT = 0x00000010;
public static void setOPPOStatusTextColor(boolean lightStatusBar, Activity activity) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
int vis = window.getDecorView().getSystemUiVisibility();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (lightStatusBar) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (lightStatusBar) {
vis |= SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT;
} else {
vis &= ~SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT;
}
}
window.getDecorView().setSystemUiVisibility(vis);
}
測驗后發現oppo手機上是有效的,在vivo上還是無效,后來發現這只適合部分os6.0以下的手機,但是不能讓低版本的手機看不到標題欄啊,于是我想了一個簡單粗暴的方法:
/**
* 設定狀態欄文字色值為深色調
*
* @param useDart 是否使用深色調
* @param activity
*/
public static void setStatusTextColor(boolean useDart, Activity activity) {
if (isFlyme()) {//判斷是否為魅族
processFlyMe(useDart, activity);//用Flyme開源代碼
} else if (isMIUI()) {//判斷是否為小米
processMIUI(useDart, activity);//用MIUI開源代碼
} else if (Build.MANUFACTURER.equalsIgnoreCase("OPPO")) {//判斷是否為oppo(可能有人說擬怎么不Build.MANUFACTURER.equalsIgnoreCase("vivo"))呢?你vivo不顯示是不是因為這個呀?(答:并不是)
setOPPOStatusTextColor(useDart, activity);//
}else {//三者均不是
if (useDart) {
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);
}else{
//重點在這 直接設定死
activity.getWindow().getDecorView().setSystemUiVisibility(Color.parseColor("#000000"));
}
} else {
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}
}
之后我的手機上運行是這樣的:標題欄雖然有了顏色 但是起碼字能看見,我只能做到這了,有更好的辦法的小伙伴 一定要告訴我啊啊啊啊啊!!!!

作為記錄 希望能幫助到大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/135543.html
標籤:Android
