Android沉浸式和状态栏颜色的修改

2023-10-27

一、前言

关于沉浸式实现的方法网上已经有很多了,但是也有点良莠不齐,在遇到实际项目中的问题之后还是需要查阅大量的博客来对问题进行查证。本博客主要是在解决沉浸式的几个问题之后,对沉浸式的一点总结方便后面再次遇到同样问题时,能够很快的查阅而不至于重头做起,也希望对你能够有帮助。

二、沉浸式的实现方法

沉浸式的实现方式有两种,一种是通过设置Theme来实现;另一种是在代码中进行实现。
2.1 通过设置Theme参考如下
在res目录下创建目录和文件,如果有的话则不用进行创建
values-v19/style.xml:对应api19+手机型号在此调用。
values-v21/style.xml:对应api21+手机型号在此调用。
values/style.xml:对应values-v19和values-v21的style.xml中没有对应主题时默认在此调用。
方法一:
values/style.xml

<style name="ImageTranslucentTheme" parent="AppTheme">
<!--Android 4.4之前的版本上运行,直接跟随系统主题-->

</style>

values-v19/style.xml

<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

values-v21/style.xml

<style name="ImageTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowTranslucentStatus">false</item>
    <item name="android:windowTranslucentNavigation">true</item>
    <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

方法二
直接在values/style.xml中通过函数API进行区分

<style name="ColorTranslucentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
        <item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
</style>

2.2 在代码中进行设置

/**
 * 通过设置全屏,设置状态栏透明
 *
 * @param activity
 */
private void fullScreen(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            View decorView = window.getDecorView();
            //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏为透明,否则在部分手机上会呈现系统默认的浅灰色
            window.setStatusBarColor(Color.TRANSPARENT);
            //导航栏颜色也可以考虑设置为透明色
            //window.setNavigationBarColor(Color.TRANSPARENT);
        } else {
            Window window = activity.getWindow();
            WindowManager.LayoutParams attributes = window.getAttributes();
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
            attributes.flags |= flagTranslucentStatus;
//                attributes.flags |= flagTranslucentNavigation;
            window.setAttributes(attributes);
        }
    }
}

在代码中进行上述设置之后,页面会出现如下情况
这里写图片描述
页面中的toolbar挤到状态栏中去了,针对这种情况有两种解决办法,一种是通过在布局中设置android:fitsSystemWindows=”true”;另一种办法是获取状态栏高度之后,设置toolbar的paddingTop值,详情参考如下:
方案一
fitsSystemWindows属性的官方解释:

Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.

当设置为true时,会在屏幕最上方预留出状态栏高度的padding。
在布局中的设置代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    >
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolBar"
        android:fitsSystemWindows="true" //ToolBar中设置
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        app:theme="@style/ToolbarTheme"
        />
</LinearLayout>

方案二
首先通过反射获取状态栏高度

//Get status bar height
    public static int getStatusBarHeight(Context context) {
        int result = 0;
        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            result = context.getResources().getDimensionPixelOffset(resId);
        }
        return result;
    }

在代码中设置Toolbar的paddingTop值,让它空出statusBar的高度

final int statusHeight = StatusBarCompat.getStatusBarHeight(this);
mToolBar.setPadding(0, statusHeight, 0, 0);

修正后的效果图如下:
这里写图片描述

三、状态栏颜色修改

Android在Android5.0之后提供了设置状态栏的颜色的函数,window.setStatusColor(@ColorInt int color),该方法生效的一个前提条件:是必须给window添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS并取消FLAG_TRANSLUCENT_STATUS,因此可以看到修改状态栏颜色的函数参考为如下:

 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void setStatusBarColor(int statusColor, Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            //取消设置Window半透明的Flag
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //添加Flag把状态栏设为可绘制模式
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏为透明
            window.setStatusBarColor(Color.TRANSPARENT);
        }
    }

在Android6.0中新增了一个属性来修改状态栏的字体的颜色,在代码中参考如下:

View decor = window.getDecorView();
    int ui = decor.getSystemUiVisibility();
    if (lightStatusBar) {
        ui |=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; //设置状态栏中字体的颜色为黑色
    } else {
        ui &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; //设置状态栏中字体颜色为白色
    }
    decor.setSystemUiVisibility(ui);

四、沉浸式状态栏设计备注

1.除非明确沉浸式页面不会有白色的背景框,否则建议不要在Android4.4-Android5.0的机型上考虑沉浸式的适配,因为如果状态栏被设置为透明色之后,显示为白色的背景会导致状态栏的字体和图标显示不清。
2.可以在项目中考虑使用第三方的沉浸式的实现。
参考文献
1.Android开发技巧–设置系统状态栏颜色
2.终于搞懂令人迷惑的 StatusBar 了
3.Android资源文件夹下面values/style.xml、values-v19/style.xml、values-v21/style.xml主题调用规则
4.Android修改状态栏颜色全方位教程
5.Android 沉浸式状态栏的实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android沉浸式和状态栏颜色的修改 的相关文章

  • 【通信基础】通信基础、编码&&调制

    https www jianshu com p 128c1157eb97 原文地址 1 通信基础 编码 调制 1 物理层的基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流 而不是指具体的传输媒体 物理层的主要任务 确定与传
  • python水印倾斜_python中图像特定位置的水印算法

    目前我正在处理一个图像处理项目 在这个项目中 我需要将图像分割成几个片段 然后在每个片段上应用水印 在 我写了一个代码 通过掩蔽将图像分成几段 您可以找到代码here 现在我想在每个片段上实现水印 水印教程可以在here找到 在 我该怎么做
  • LeetCode--初级算法--数组篇--第二题--买卖股票的最佳时机 II

    GitHub地址 题目 给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 注意 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票
  • 淘宝SEO珍贵笔记

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 分享淘宝SEO技术 讲诉如何使用 关键词 带来百万IP流量 大家都有目共睹淘宝七月八号改变规则后引发了不少争议 后面所引起的众多卖家 围攻 淘宝之事也不仅发生过一次了 还有
  • 如何解决vcruntime140.dll找不到的问题?两种方法教你解决

    当你在运行某些应用程序或游戏时 可能会遇到一个错误提示 即 找不到vcruntime140 dll 文件 这是因为你的电脑中缺少了这个动态链接库文件 这个问题可能会导致你无法正常使用某些应用程序 在本文中 我们将介绍两种方法来解决 目录 一
  • 树莓派安装Ubuntu22.04后使用X86_Linux交叉编译Qt5+opencv4

    文章目录 准备工作 环境搭建 准备编译 未完待续 准备工作 树莓派安装Ubuntu 直接从官网下载对应的镜像烧写工具下载地址 工具里面准备好了对应的镜像地址 直接烧写入SD卡就行了 进入系统 ubuntu server22 04默认密码应该
  • k8s 使用GlusterFS做持久化存储

    一 创建GlusterFS 首先找几台主机做GlusterFS存储 这里用了3台主机 10 244 0 10 10 244 0 11 10 244 0 12 安装GlusterFS 安装过程如下 安装 gluster 源 yum insta
  • 【数据结构】图解八大排序(上)

    文章目录 一 排序简介 二 直接插入排序 三 希尔排序 四 直接选择排序 五 堆排序 六 冒泡排序 七 冒泡排序与直接插入排序效率对比 一 排序简介 生活中 我们经常能看到排序的应用 例如 我们在网购商品的时候 经常按销量从高到低排序 常见
  • C语言经典100例题(38)--求一个3 * 3矩阵对角线元素之和

    目录 题目 问题分析 代码 测试结果 题目 求一个3 3矩阵对角线元素之和 问题分析 利用双重for循环控制输入二维数组 再将 a i i 累加后输出 代码 include
  • SpringBoot2.x使用缓存注解操作Redis

    为了进一步简化 Redis 的使用 Spring还提供了缓存注解 使用这些注解可以有效简化编程过程 缓存管理器和缓存的启用 Spring 在使用缓存注解前 需要配置缓存管理器 缓存管理器将提供一些重要的信息 如缓存类型 超时时间等 Spri
  • 低代码开发工具到底是给“谁”用的?

    不同的工具 受众也不一样 你不要认为 低代码开发工具 只有一种 实际上它分 3 种 第一种 企业级低代码开发平台 这种通常是给专业开发人员使用的 但也没有限制得很死 只要你懂编程逻辑 能写sql语句 就基本会用 就连专业的产品经理也可以用来
  • Vue实现多文件上传功能(前端 + 后端代码)

    开发项目的时候 用到文件上传的功能很常见 包括单文件上传和多文件上传 上传各种类型的文件 在vue里面要实现多文件上传功能 还是很方便的 本文就一起来学习一下 如何把多文件上传功能封装成一个组件 后面需要使用的时候 直接两三行代码就能搞定
  • 已解决(Python爬虫requests报错)requests.exceptions.ProxyError: HTTPSConnectionPool

    成功解决 Python爬虫requests报错 requests exceptions ProxyError HTTPSConnectionPool 文章目录 报错信息 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错
  • Unix域编程流程简单梳理

    文章目录 Unix域编程作用 Unix域编程流程 Unix域编程的地址格式 Unix编程注意事项 Unix编程简单示例 客户端实例 服务端实例 Unix域编程作用 Unix域编程用于同一台主机内部的进程之间的客户端 服务端通信 使用和网络s
  • 什么是LTS、Alpha、Beta、Dev、Release、Patch版本,软件的开发周期有多少种命名

    根据Wikipedia 2023 Software release life cycle显示 软件的开发周期版本命名有以下几种 Pre alpha Dev Alpha Beta Perpetual beta Open and closed
  • Boyer-Moore 投票算法(摩尔投票法)

    摩尔投票法简单来说就是在不影响或者增大众数在整个数组中的地位的情况下去消除无关数字带来的影响 只需遍历一遍数组即可找到众数 算法流程 先随机假设一个数x为候选数 可以假设数组的第一个数 并尝试维护一个count计数器 开始设置为0 设置了众
  • GPT系列训练与部署——Colossal-AI环境配置与测试验证

    Colossal AI框架主要特色在于对模型进行并行训练与推理 多GPU 从而提升模型训练效率 可快速实现分布式训练与推理 目前 该框架已集成很多计算机视觉 CV 和自然语言处理 NLP 方向的算法模型 特别是包括GPT和Stable Di
  • Hbuilder We're sorry

    当Webview窗口加载错误地址 如本地页面不存在 或者访问网络资源失败 如无法访问网络 时会自动显示默认错误页面 可以通过以下方法自定义Webview的404等错误页面 设置应用全局默认错误页面 5 App和wap2app 在应用的man
  • OSPF从初学到放弃 2.1

    本来要开开心心写博客的 结果刚刚看见之间知乎上的两个评论被要求修改 两篇评论都是关于同一个问题的 我都有理由怀疑是资本的力量太强大了 说好的舆论自由呢 一群骗子 好气好气好气 OSPF协议及作业 前言 一 OSPF是什么 仔细说一下 二 聊

随机推荐

  • 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例

    一 什么叫爬虫 爬虫 又名 网络爬虫 就是能够自动访问互联网并将网站内容下载下来的程序 它也是搜索引擎的基础 像百度和GOOGLE都是凭借强大的网络爬虫 来检索海量的互联网信息的然后存储到云端 为网友提供优质的搜索服务的 二 爬虫有什么用
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    文章目录 前言 什么是二分查找算法 1 二分查找 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 在排序数组中查找元素的第一个和最后一个位置 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 搜索插入位置
  • USB MSC类存储设备及FatfsR0.14移植

    USB MSC类存储设备及FatfsR0 14移植 效果演示 配置说明 USB MSC类配置 FatFs移植 FatFs的配置 驱动接口 FatFs测试 USB MSC驱动接口完善 效果演示 这里演示了 FatFs挂载SPI Flash设备
  • java中的锁(基础篇)

    乐观锁和悲观锁 悲观锁 适合写操作多的场景 先加锁可以保证写操作时的数据正确 乐观锁 实际开发 Synchronized关键字 悲观锁 加了后同一时间有且只有一个线程可以进入锁内 1 修饰实例方法 作用于当前实例对象加锁 进入同步代码前要获
  • ReinHard颜色迁移

    看到颜色迁移 觉得还蛮有意思的 遂简单看了一下 代码实现好像有错误 但是不知道错误出在哪里 算法参考 https blog csdn net sin geek article details 22443537 https blog csdn
  • SD卡的控制方法与时序

    1 1 SD卡的命令格式 SD卡的指令由6字节 Byte 组成 如下 Byte1 0 1 x x x x x x 命令号 由指令标志定义 如CMD39为100111即16进制0x27 那么完整的CMD39第一字节为01100111 即0x2
  • [Numpy] mgrid与ogrid

    文章目录 numpy mgrid numpy ogrid numpy mgrid numpy lib index tricks nd grid的替代 在给定范围内返回一个ndarray 是网格上的点 import numpy as np 起
  • webpack安装和使用及超详细配置一个基本vue项目的全部流程(包括路由、less、引入图片渲染)

    文章目录 一 搭建一个简单的webpack项目 1 准备工作 2 初始化项目 3 安装并使用webpack 1 使用npm语句安装webpack和webpack cli 2 检测是否安装成功 需要注意点是由于webpack并不是全局安装的
  • 【BMC】简介

    什么是BMC 在介绍BMC之前需要了解一个概念 即平台管理 platform management 平台管理表示的是一系列的监视和控制功能 操作的对象是系统硬件 比如通过监视系统的温度 电压 风扇 电源等等 并做相应的调节工作 以保证系统处
  • Linux配置sar服务

    Linux配置sar服务 下面以suse 为例 其他系统类似 检查是否有安装sar服务 sar服务包含在sysstat软件包中 rpm qa grep sysstat 如果没有安装执行下面的命令安装 zypper install sysst
  • OCR-APP开发总结(一)

    一 解决删除 运行模式 布局的问题 1 直接将对应的xml部分删除 2 将 Java中MainActivity中引用对应的ID部分删除 并将运行模式的值默认 3 效果图 二 裁剪方法 方法1 android自带的crop进行裁剪 缺点 裁剪
  • Spring MVC类型转换的相关说明

    转自 Spring MVC类型转换的相关说明 下文讲采用示例的方式 讲述相关类型说明 如下所示 insert jsp页面的代码如下
  • C++ 命名空间 & 模板

    命名空间 为了区分不同库中相同名称的函数 类 变量等 引入概念 命名空间 它可作为附加信息来帮助区分它们 使用了命名空间即定义了上下文 本质上就是定义了一个范围 定义命名空间 命名空间的定义使用关键字 namespace 后跟命名空间的名称
  • python实现从零搭建图书管理系统

    学习目标 tornado入门学习 异步服务器学习 异步数据库操作 一 虚拟环境 1 1 虚拟环境的创建 mkvirtualenv tornado py3 p python3 1 2 安装tornado pip install tornado
  • QT学习(一)—— 第一个QT项目

    1 1 新建一个项目 添加项目名称 选择Qwidget类 暂时不选择Generate form那个 补充 这里介绍了一下widget mainWindow dialog三种类的关系 编译器用QT自带的 创建完毕 1 2 项目介绍 1 2 1
  • python爬取内容剔除nbsp_Python正则获取、过滤或者替换HTML标签的方法

    本文实例介绍了Python通过正则表达式获取 去除 过滤 或者替换HTML标签的几种方法 具体内容如下 python正则表达式关键内容 python正则表达式转义符 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线或汉字 s 匹配任意
  • CVPR2023:BiFormer阅读笔记

    目录 前言 1 模型的特点 2 双层路由注意力机制 BRA 3 BiFormer的结构 前言 BiFormer是CVPR2023的一篇文章 文中提出自注意力机制作为Transformer的核心模块 可以帮助网络捕捉长距离上下文依赖 但是这种
  • 基于MFC-MSComm控件的PC与单片机串口通信编程

    作者 uedsr542 来源 51hei 使用工具Visual C 6 0 9针RS232串口线一条 P0口带上拉的LED的51最小系统版 打开软件 新建 gt MFC AppWizard exe 再填写工程名和路径 gt 基于对话框 不需
  • Java项目数据迁移怎么做的

    Java项目数据迁移怎么做的 1 A表到B表找字段映射 即两个不同库表先做好数据字段的对应和补齐 2 代码程序 java 做功能 从一个数据库表中读出数据 然后写到另一个数据库表中 技术历练点 多线程 使用线程池 确定核心线程池的数量 使用
  • Android沉浸式和状态栏颜色的修改

    一 前言 关于沉浸式实现的方法网上已经有很多了 但是也有点良莠不齐 在遇到实际项目中的问题之后还是需要查阅大量的博客来对问题进行查证 本博客主要是在解决沉浸式的几个问题之后 对沉浸式的一点总结方便后面再次遇到同样问题时 能够很快的查阅而不至