1. 程式人生 > >Android修改狀態列的背景顏色

Android修改狀態列的背景顏色

一,概述

我相信很多初入Android開發的開發者都為自己開發的app的狀態列煩惱過,狀態列和自己的介面風格格格不入,但是不知道如何修改這個狀態列的顏色,感覺無從下手.我最近就是被這個狀態的預設風格搞得焦頭爛額,終於找到了相應的解決辦法.雖然程式碼不是我寫的,我也只能看懂一部分程式碼,但這又有什麼關係呢?我們這些熱愛Java語言的人,在看不懂別人程式碼的情況下,只要會面向物件就行了.所有我就直接把找到的程式碼當成一個工具類,用著真舒服,在此就謝謝那個(或者那些)無名大神了.

二,狀態列工具類

這個狀態列工具類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;

/**
 * 用來管理手機狀態列一系列操作,主要是就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專案中是會報錯的,因為這個工具類也是基於一個開源專案的.我通過報錯的程式碼,找啊找,馬上就在github上找到了,就是這個開源專案SystemBarTint.這個專案雖然已經顯示廢棄不再維護了,但是好像還是很多人在用.那我當然也用了.

三,匯入開源專案

在AS專案的app目錄下的build.gradle檔案的dependencies閉包中,新增如下這行程式碼,同步後就可以使用SystemBarTint這個專案了.

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

工具類中的那幾個方法的作用一看就懂,我討厭預設的狀態列效果,就在自己寫的Activity基類的onCreate()方法中添加了如下一行程式碼:
 //將狀態列設定為綠色:#38B059
        changeStatusBarColor(R.color.myColor_green);
R.color.myColor_green就是我在color檔案中宣告的一個顏色,就是#38B059了.看個效果唄:


我將狀態列設定成#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