设置Android状态栏的颜色

Android开发—设置状态栏颜色透明 在Android4.4之前,我们的应用没法改变手机的状态栏颜色,如上图一样应用的风格非常不美观;为了提供更好的界面交互,google在Android4.4.2开始提供了设置沉浸式状态栏的方法,,实际的效果其实就是透明的状态栏,然后在状态栏的位置显示我们自定义的颜色,通常为应用的actionbar的颜色,或者是将应用的整体的一张图片也占据到状态栏中,网上很多大牛写过沉浸式状态栏的代码,今天... 阅读详情

1. 前言

现在的APP为了提高界面美观,会根据界面整体的风格,调整状态栏的颜色。但是由于安卓系统版本众多,有谷歌Android、小米MIUI、华为EMUI等等,而且对于设置状态栏的颜色还没有一个统一标准,所以适配起来是一件很麻烦的事情。通过查询资料,我汇总了一些方法,封装了一个工具类StatusBarUtils。

2. 工具类

package com.fantasy.utils.ui;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 状态栏工具类
 * <pre>
 *     author  : Fantasy
 *     version : 1.0, 2018-12-10
 *     since   : 1.0, 2018-12-10
 * </pre>
 */
public class StatusBarUtils {

    /**
     * 获取状态栏的高度,有可能获取到的大小为0
     *
     * @param context 上下文
     * @return 高度,单位为像素
     */
    public static int getHeight(Context context) {
        int height = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            height = context.getResources().getDimensionPixelSize(resourceId);
        }
        return height;
    }

    /**
     * 设置状态栏颜色,支持4.4以上版本
     *
     * @param activity 活动
     * @param colorId  颜色值
     */
    public static void setColor(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版本状态栏变色,但需要先将状态栏设置为透明
//            // com.readystatesoftware.systembartint:systembartint:1.0.3
//            useTransparentMode(activity);
//            SystemBarTintManager tintManager = new SystemBarTintManager(activity);
//            tintManager.setStatusBarTintEnabled(true);
//            tintManager.setStatusBarTintResource(colorId);
//        }
    }

    /**
     * 使用透明状态栏
     *
     * @param activity 活动
     */
    public static void useTransparentMode(Activity activity) {
        Window window = activity.getWindow();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    /**
     * 使用亮色状态栏,黑色文字和图标
     * 适配4.4以上版本MIUI、Flyme和Android 6.0及以上
     *
     * @param activity 活动
     * @return 1:MIUI 2:Flyme 3:Android 6.0
     */
    public static int useLightMode(Activity activity) {
        int result = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (useMIUILightMode(activity, true)) {
                result = 1;
            } else if (useFlymeLightMode(activity.getWindow(), true)) {
                result = 2;
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 设置状态栏文字深色,同时保留之前的flag
                int originFlag = activity.getWindow().getDecorView().getSystemUiVisibility();
                activity.getWindow().getDecorView().setSystemUiVisibility(originFlag
                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

                //activity.getWindow().getDecorView().setSystemUiVisibility(
                //        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                result = 3;
            }
        }
        return result;
    }

    /**
     * 已知系统类型时,使用亮色状态栏,黑色文字和图标
     * 适配4.4以上版本MIUI、Flyme和Android 6.0及以上
     *
     * @param activity 活动
     * @param type     1:MIUI 2:Flyme 3:Android6.0
     */
    public static void useLightMode(Activity activity, int type) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (type == 1) {
                useMIUILightMode(activity, true);
            } else if (type == 2) {
                useFlymeLightMode(activity.getWindow(), true);
            } else if (type == 3) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    // 设置状态栏文字深色,同时保留之前的flag
                    int originFlag = activity.getWindow().getDecorView().getSystemUiVisibility();
                    activity.getWindow().getDecorView().setSystemUiVisibility(originFlag
                            | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

                    //activity.getWindow().getDecorView().setSystemUiVisibility(
                    //        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                }
            }
        }
    }

    /**
     * 已知系统类型时,使用暗色状态栏,清除黑色文字和图标效果
     * 适配4.4以上版本MIUI、Flyme和Android 6.0及以上
     *
     * @param activity 活动
     * @param type     1:MIUI 2:Flyme 3:Android6.0
     */
    public static void useDarkMode(Activity activity, int type) {
        if (type == 1) {
            useMIUILightMode(activity, false);
        } else if (type == 2) {
            useFlymeLightMode(activity.getWindow(), false);
        } else if (type == 3) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);

            // 清除状态栏文字深色,同时保留之前的flag
            //int originFlag = activity.getWindow().getDecorView().getSystemUiVisibility();
            // 使用异或清除SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            //activity.getWindow().getDecorView().setSystemUiVisibility(originFlag
            //        ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }
    }

    /**
     * 设置状态栏图标为深色和魅族特定的文字风格
     * 可以用来判断是否为Flyme用户
     *
     * @param window 需要设置的窗口
     * @param dark   是否把状态栏文字及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    private static boolean useFlymeLightMode(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;
    }

    /**
     * 需要MIUI 6以上
     *
     * @param activity 活动
     * @param dark     是否把状态栏文字及图标颜色设置为深色
     * @return boolean 成功执行返回true
     */
    private static boolean useMIUILightMode(Activity activity, boolean dark) {
        boolean result = false;
        Window window = activity.getWindow();
        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;

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
                    if (dark) {
                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                    } else {
                        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                    }
                }
            } catch (Exception e) {
            }
        }
        return result;
    }

}

3. 如何使用

我提供的工具类默认是只支持5.0及以上版本,如果还想兼容到4.4的话,可以把setColor()方法里面的注释去掉,使用第三方库 SystemBarTint ,如下所示:

    /**
     * 设置状态栏颜色,支持4.4以上版本
     *
     * @param activity 活动
     * @param colorId  颜色值
     */
    public static void setColor(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版本状态栏变色,但需要先将状态栏设置为透明
            // com.readystatesoftware.systembartint:systembartint:1.0.3
            useTransparentMode(activity);
            SystemBarTintManager tintManager = new SystemBarTintManager(activity);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setStatusBarTintResource(colorId);
        }
    }

3.1 使用亮色状态栏,黑色文字和图标

这里以“白色状态栏”为例,具体如下:

// 白色状态栏
// 同时需要在布局文件中的根布局加上android:fitsSystemWindows="true"
// 因为不加的话,小米手机会呈现出全屏状态,界面会顶到最上面,会被状态栏遮住
StatusBarUtils.useLightMode(this);
StatusBarUtils.setColor(this, R.color.white);

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

</RelativeLayout>

3.2 使用暗色状态栏,白色文字和图标

这里以“红色状态栏”为例,具体如下:

StatusBarUtils.setColor(this, R.color.red);

 

TeXstudio完整安装配置教程(2025最新版) 至此,你已经完成了TeXstudio的完整安装和配置!现在你可以:✅ 使用TeXstudio编写LaTeX文档✅ 正确编译中英文混排的文档✅ 掌握基本的编辑和配置技巧LaTeX的学习曲线较陡,但一旦掌握,你会发现它在学术写作中的强大之处。建议从简单的文档开始练习,逐步掌握更高级的功能。祝你LaTeX写作顺利!如果有任何问题,欢迎在评论区留言交流。关键词:TeXstudio安装、LaTeX环境配置、中文LaTeX、TeX Live、学术论文写作更新日期:2025年10月。 阅读详情

相关推荐

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1909

状态栏着色

【代码】状态栏着色。

leilifengxingmw的博客 4405

LVGL在RTOS下的线程安全实践:从卡死到流畅的界面切换

本文探讨LVGL在RTOS环境下的线程安全实践,重点分析FreeRTOS多任务同步机制,包括互斥锁、任务通知和消息队列方案。通过实际案例展示如何避免界面卡顿和系统死锁,实现从卡死到流畅的界面切换,为嵌入式GUI开发提供可靠的适配解决方案。

uran的专栏 1111

Android:动态设置顶部状态栏颜色

第一种 //顶部框颜色 SystemUtil.setStatusBarColor(this, this.getResources().getColor(R.color.top_background_color)); 第二种 //顶部框颜色 SystemUtil.setStatusBarColor(this, Color.parseColor("#F5F5F5")); SystemUtil.java /** * 系统工具类 * / public clas

谢桥的博客 1376

STM32F103+W5500网络通信

STM32F103+W5500网络通信一、W5500模块(一)W5500以太网模块介绍(二)模块排针功能表二、 modbus协议(一)modbus协议原理(二)Modbus 通讯方式1.Modbus三种通讯方式2.在Modbus网络上传输3.以太网(modbus tcp/ip)三、参考资料 一、W5500模块 (一)W5500以太网模块介绍 D-W5500 EVB以太网模块是一款基于WIZnet W5500芯片的以太网模块,且性价比高的以太网模块。W5500是一款全硬件TCP/IP嵌入式以太网控制器,为

”一只特立独行的猪“的博客 1万+

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8901

Android自动设置状态栏字体颜色

Android6.0以上系统可以把状态栏文字和图标换成深色,但是MIUI、Flyme例外 所以我们封装一个根据状态栏颜色来自动设置状态栏字体颜色

jiulang9的博客 3634

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 466

动态设置状态栏背景颜色和状态栏字体颜色

先看效果图: (上图为我的毕业设计,我会每天提交代码到Github,欢迎star,fork。GitHub链接:https://github.com/uweii/SHShop) 1.设置状态栏背景颜色 //拿到window Window window = activity.getWindow(); //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏 windo...

uwei的博客 3146

DC/DC开关电源学习笔记(十三)Buck-Boost升降压电路工作原理

Buck-Boost电路是一种能够实现输出电压高于或低于输入电压的DC-DC变换器,且输出电压极性与输入电压相反。它结合了Buck(降压)和Boost(升压)两种拓扑的特点,广泛应用于需要灵活电压调整的场合,如电池供电设备、LED驱动和工业控制系统。本文将从电路结构、工作原理、关键公式推导及实际应用等方面进行详细分析。

小幽余生不加糖 3505

AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发

注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。

nihaoljq2010的博客 833

Android修改状态栏

效果图 这里的处理都是Android5.0以上的。 修改状态栏颜色 Window window = activity.getWindow(); window.setStatusBarColor(Color.MAGENTA); 隐藏状态栏 法一 Window window = getWindow(); View decorView = window.getDecorView(); deco...

Shine56的博客 1257

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2159

Qt6 for Android 设置安卓状态栏、导航栏与主界面保持同样的颜色

本人的开放环境是Qt6.5.3,网上关于Qt6设置安卓状态栏和导航栏颜色的教程也是非常的少,几乎找不到,只有Qt5的,但是Qt5是通过设置AndroidManifest.xml以及styles.xml等方法设置的,但是在Qt6中通过AndroidManifest.xml以及styles.xml等方法设置无法起到作用,所以这里我给大家一个更简单设置Android状态栏以及导航栏颜色与主界面颜色保持一致的方法;

zyd976929992的博客 528

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

安卓状态栏颜色设置

安卓并不提供修改状态栏字体的sdk,系统根据页面风格自动处理字体颜色(前提:需要设置成NoActionBar,否则状态栏字体不随页面风格改变),所以我们可以通过设置页面风格简介设置状态栏字体颜色

xiaokangss的博客 5792

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android设置顶部状态栏颜色

参考博客:https://blog.youkuaiyun.com/qq_36982160/article/details/82350993 一张图了解android状态栏颜色划分 方法一:通过代码设置状态栏颜色 /** * 状态栏相关工具类 * */ public class StatusBarUtils { //设置Activity对应的顶部状态栏的颜色 public static void setWindowStatusBarColor(Activity activity,

CAir2的专栏 3692

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

安卓代码设置状态栏颜色及字体黑白色

安卓代码设置状态栏颜色及黑白色 直接上代码: protected void setDarkStatusWhite(boolean bDark) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { View decorView = getWindow().getDecorView(); getWindow().setStatusBarColor(getResources().getColor(android.R.color.white));//

u011108083的博客 610

Android开发技巧——设置系统状态栏颜色

开门见山,先来三张效果图: 然后我们再来讲如何实现以及如何快速地实现。如何实现实现设置系统状态栏颜色需要至少在Android 4.4.2(API 19)以上。这是因为,在这个版本以下,没有任何的API可以帮助我们来实现。那么具体如何设置呢?Android 4.4.2实现Android 4.4.2新增了一个特性,即可以设置系统状态栏为半透明。设置方法有两种,一是通过在主题style中添加以下

一个码农的博客 8万+

Android 设置状态栏颜色 白色

给Activity 设置 theme 可以设置状态栏的背景颜色 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.AppTheme_personal); } &...

qq_33346542的博客 2216

Android隐藏系统状态栏(沉浸式状态栏)和设置状态栏颜色

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_

m0_66264324的博客 3543

android设置状态栏颜色

android设置状态栏颜色 在BaseActivity中设置 setWindowStatusBarColor(this, R.color.transparent,true); public void setWindowStatusBarColor(Activity activity, int colorResId,boolean dark) { try { ...

only95 604

Android4.4、Android5.0+状态栏颜色、透明等设置

Android 4.4 Manifest文件Activity的Theme设置: true true 代码中设置: if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = getW

Vieboo韦伯 1万+

android怎么设置菜单颜色,Android如何设置顶部状态栏颜色(主题)

在Android中我们经常需要设置屏幕顶部状态栏的主题和应用页面保持同一风格,本文介绍几种常用的设置方案:状态栏将显示为纯净的颜色,没有渐变效果/*** 状态栏相关工具类**/public class StatusBarUtils {//设置Activity对应的顶部状态栏的颜色public static void setWindowStatusBarColor(Activity activity...

weixin_42526417的博客 1301
上一篇: Android获取屏幕宽度和高度、状态栏高度的方式
下一篇: Android WebView相关材料汇总
Fantasy丶Lin
博客等级 码龄11年 92粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值