版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

  状态栏着色,也就是我们经常听到的沉浸式状态栏,关于沉浸式的称呼网上也有很多吐槽的,这里就不做过多讨论了,以下我们统称状态栏着色,这样我觉得更加容易理解。

  从Android4.4开始,才可以实现状态栏着色,并且从5.0开始系统更加完善了这一功能,可直接在主题中设置<item name="colorPrimaryDark">@color/colorPrimaryDark</item>或者getWindow().setStatusBarColor(color)来实现,但毕竟4.4+的机器还有很大的占比,所以就有必要寻求其它的解决方案。

  一般通过Android Studio新建项目时就实现了状态栏着色功能,不过只能在API>19的机型上正常显示。下面是通过Android studio新建项目时的默认样式代码:

styles.xml

colors.xml

AndroidManifest.xml

而本文想要实现的效果是在API>19和API<19的机型上都兼容状态栏着色效果。

效果图

API>19 API =19 API <19

 

代码分析

  • 首先将手机手机状态栏透明化

  在values、values-v19、values-v21目录下分别创建相应的主题,然后在AndroidManifest.xml中给Application设置该主题。

   

  • 在布局文件中添加android:fitsSystemWindows="true"属性

  我们使用android:fitsSystemWindows="true"属性,不让布局延伸到状态栏,这时状态栏就是透明的,然后添加一个和状态栏高、宽相同的指定颜色View来覆盖被透明化的状态栏。

  • 创建View并添加到状态栏

使用步骤

一、项目组织结构图

注意事项:

  • 导入类文件后需要change包名以及重新import R文件路径
  • values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、使用方法

修改valus目录下的styles.xml文件【在eclipse开发环境和Android studio开发环境中建议使用不同的样式】

  1. <resources>
  2.  
  3. <!--
  4. Base application theme, dependent on API level. This theme is replaced
  5. by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
  6. -->
  7. <!--
  8. Theme customizations available in newer API levels can go in
  9. res/values-vXX/styles.xml, while customizations related to
  10. backward-compatibility can go here.
  11. -->
  12. <!-- Eclipse开发环境 -->
  13. <!--<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
  14. </style>-->
  15. <!-- Android Studio开发环境 -->
  16. <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  17. </style>
  18.  
  19. <!-- Application theme. -->
  20. <style name="AppTheme" parent="AppBaseTheme">
  21. <!-- All customizations that are NOT specific to a particular API-level can go here. -->
  22. </style>
  23.  
  24. <!-- Android 状态栏着色 -->
  25. <style name="TranslucentTheme" parent="AppTheme">
  26. </style>
  27.  
  28. </resources>

添加\修改values-v19目录下的styles.xml文件【在eclipse开发环境和Android studio开发环境中建议使用不同的样式】

  1. <resources>
  2.  
  3. <!--
  4. Base application theme for API 19+. This theme completely replaces
  5. AppBaseTheme from BOTH res/values/styles.xml and
  6. res/values-v11/styles.xml on API 19+ devices.
  7. -->
  8. <!-- API 19 theme customizations can go here. -->
  9.  
  10. <!-- Eclipse开发环境 -->
  11. <!--<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
  12. </style>-->
  13. <!-- Android Studio开发环境 -->
  14. <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  15. </style>
  16.  
  17. <!-- Android 状态栏着色 -->
  18. <style name="TranslucentTheme" parent="AppTheme">
  19. <item name="android:windowTranslucentStatus">true</item>
  20. <item name="android:windowTranslucentNavigation">false</item>
  21. </style>
  22.  
  23. </resources>

添加\修改values-v21目录下的styles.xml文件【在eclipse开发环境和Android studio开发环境中建议使用不同的样式】

  1. <resources>
  2.  
  3. <!--
  4. Base application theme for API 21+. This theme completely replaces
  5. AppBaseTheme from BOTH res/values/styles.xml and
  6. res/values-v11/styles.xml on API 21+ devices.
  7. -->
  8. <!-- API 21 theme customizations can go here. -->
  9. <!-- Eclipse开发环境 -->
  10. <!--<style name="AppBaseTheme" parent="android:Theme.Light.NoTitleBar">
  11. </style>-->
  12. <!-- Android Studio开发环境 -->
  13. <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  14. </style>
  15.  
  16. <!-- Android 状态栏着色 -->
  17. <style name="TranslucentTheme" parent="AppTheme">
  18. <item name="android:windowTranslucentStatus">true</item>
  19. <item name="android:windowTranslucentNavigation">false</item>
  20. <item name="android:statusBarColor">@android:color/transparent</item>
  21. </style>
  22.  
  23. </resources>

在values目录下的colors.xml文件中添加状态栏着色的颜色值代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!-- Android 状态栏着色 -->
  4. <color name="colorPrimary">#0164C5</color>
  5. </resources>

在AndroidManifest.xml中给Application设置TranslucentTheme主题

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.why.project.statusbarcolor">
  4.  
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true"
  10. android:theme="@style/TranslucentTheme">
  11. <activity android:name=".MainActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN"/>
  14.  
  15. <category android:name="android.intent.category.LAUNCHER"/>
  16. </intent-filter>
  17. </activity>
  18. </application>
  19.  
  20. </manifest>

在activity布局文件中的根节点元素中添加android:fitsSystemWindows="true"

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- Android 状态栏着色:android:fitsSystemWindows="true" -->
  3. <RelativeLayout
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. android:id="@+id/activity_main"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. tools:context="com.why.project.statusbarcolor.MainActivity"
  10. android:fitsSystemWindows="true">
  11.  
  12. <TextView
  13. android:layout_width="match_parent"
  14. android:layout_height="56dp"
  15. android:text="Hello World!"
  16. android:textColor="#ffffff"
  17. android:background="@color/colorPrimary"
  18. android:gravity="center"/>
  19. </RelativeLayout>

在Activity基类以及子类中添加以下标记的代码

  1. package com.why.project.statusbarcolor;
  2.  
  3. import android.content.Context;
  4. import android.os.Build;
  5. import android.os.Bundle;
  6. import android.support.annotation.Nullable;
  7. import android.support.v4.content.ContextCompat;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.widget.LinearLayout;
  12.  
  13. /**
  14. * Created by HaiyuKing
  15. * Used activity基类
  16. */
  17.  
  18. public class BaseActivity extends AppCompatActivity{
  19.  
  20. @Override
  21. protected void onCreate(@Nullable Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. }
  24.  
  25. /*==========Android 状态栏着色=============*/
  26. public void addStatusBarView() {
  27. int height;
  28. height = getStatusBarHeight(this);
  29. if (height <= 0) {
  30. return;
  31. }
  32. View view = new View(this);
  33. view.setBackgroundColor(ContextCompat.getColor(this,R.color.colorPrimary));
  34. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
  35. ViewGroup decorView = (ViewGroup) findViewById(android.R.id.content);
  36. decorView.addView(view, params);
  37. }
  38.  
  39. /**
  40. * 获取状态栏的高度
  41. * 19API以上 读取到状态栏高度才有意义
  42. */
  43. public int getStatusBarHeight(Context context) {
  44. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  45. int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
  46. return resourceId > 0 ? context.getResources().getDimensionPixelSize(resourceId) : 0;
  47. } else {
  48. return 0;
  49. }
  50. }
  51. }
  1. package com.why.project.statusbarcolor;
  2.  
  3. import android.os.Bundle;
  4.  
  5. public class MainActivity extends BaseActivity {
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11.  
  12. /*==========Android 状态栏着色=============*/
  13. addStatusBarView();
  14. }
  15.  
  16. }

注意:

  • Android studio新建的项目默认extends AppCompatActivity !如果是Eclipse开发环境则需要修改为extends Activity或者FragemntActivity或者自定义的activity基类。
  • 如果activity布局中含有fragment布局,那么在Activity含有以上代码的基础上只需要在fragment布局文件中添加上android:fitsSystemWindows="true"即可

混淆配置

参考资料

Android 状态栏着色实践

Android开发-状态栏着色原理和API版本兼容处理

项目demo下载地址

https://github.com/haiyuKing/AndroidStatusBarColorDemo

Android状态栏着色的更多相关文章

  1. Android 透明状态栏&着色状态栏

    Android 5.0 及以上实现方式(android在5.0之后引入Material Design 实现方式相对简单) 透明状态栏,背景浸入状态栏 if (Build.VERSION.SDK_INT ...

  2. Android开发-状态栏着色原理和API版本号兼容处理

    介绍 先上实际效果图,有三个版本号请注意区分API版本号 API>=20 API=19 API<19 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX ...

  3. Android状态栏颜色修改

    android状态栏颜色修改   状态栏颜色的修改在4.4和5.x环境下分别有不同的方式,低于4.4以下是不能修改的.   5.x环境下 方式一,状态栏将显示为纯净的颜色,没有渐变效果 /** * 状 ...

  4. Android状态栏透明(沉浸式效果)

    Android状态栏透明(沉浸式效果) 默认效果 沉浸式效果 方式一 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487880 ...

  5. Android如何着色字符串的特定部分

    文章选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文探讨Android如何着色字符串的特定部分. ...

  6. android状态栏和NavigationBar的动态控制显示

    项目在开发阅读器,阅读器对阅读界面的要求就是在工具栏不显示的状态下,ActionBar和NavigationBar都是不显示的,当工具栏显示时它们都出来,这就需要动态控制它们的显示与隐藏. 第一阶段: ...

  7. [Android] 状态栏的一些认识

    前段时间遇到几个关于状态栏的问题,又了解了一下状态栏相关的知识,现在做一下记录. 本文地址:http://www.cnblogs.com/rossoneri/p/4316343.html 前戏和问题 ...

  8. android状态栏总结

    针对状态栏的操作,只针对4.4kitKat(含)以上的机型,部分国产rom会失效,目前发现的有华为的EMUI Activity必须是noActionbar主题 本文基于StatusBarUtils略作 ...

  9. Translucent Bar Android状态栏自定义颜色

    Android4.4 一个很重要的改变就是透明系统栏..新的系统栏是渐变透明的, 可以最大限度的允许屏幕显示更多内容, 也可以让系统栏和 Action Bar 融为一体, 仅仅留下最低限度的背景保护以 ...

随机推荐

  1. UnicodeEncodeError: 'ascii' codec can't encode character...的解决方法

    在python2.7下,因为想从数据库中读出来分类名进行写入到文件,提示 Traceback (most recent call last): File "test.py", li ...

  2. 关于Kafka配额的讨论(2)

    继续前一篇的讨论.前文中提到了两大类配额管理:基于带宽的以及基于CPU线程使用时间的.本文着重探讨基于CPU线程时间的配额管理. 定义 这类配额管理被称为请求配额(request quota),管理起 ...

  3. 用beego开发服务端应用

    用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...

  4. Elasticsearch笔记三之版本控制和插件

    版本控制 1:关系型数据库使用的是悲观锁,数据被读取后就被锁定其他的线程就无法对其进行修改. 2:ex使用的是乐观锁,数据被读取后其他程序还可以对其进行修改,而执行修改时发现此数据已经被修改则修改就会 ...

  5. 【Homework】LCA&RMQ

    我校是神校,作业竟然选自POJ,难道不知道“珍爱生命 勿刷POJ”么? 所有注明模板题的我都十分傲娇地没有打,于是只打了6道题(其实模板题以前应该打过一部分但懒得找)(不过感觉我模板还是不够溜要找个时 ...

  6. h5仿微信聊天(高仿版)、微信聊天表情|对话框|编辑器

    之前做过一版h5微信聊天移动端,这段时间闲来无事就整理了下之前项目,又重新在原先的那版基础上升级了下,如是就有了现在的h5仿微信聊天高仿版,新增了微聊.通讯录.探索.我四个模块 左右触摸滑屏切换,聊天 ...

  7. 大白话5分钟带你走进人工智能-第十四节过拟合解决手段L1和L2正则

                                                                               第十四节过拟合解决手段L1和L2正则 第十三节中, ...

  8. Vue之生命周期函数和钩子函数详解

    在学习vue几天后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的.因为我们有时候会在几个钩子函 ...

  9. Python爬虫入门教程 56-100 python爬虫高级技术之验证码篇2-开放平台OCR技术

    今日的验证码之旅 今天你要学习的验证码采用通过第三方AI平台开放的OCR接口实现,OCR文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的. 注册百度AI平台 官方网址:http:/ ...

  10. 【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源

    如果你发现还有西半球的资源,烦请相告,不胜感谢! 一..NET Core基础 微软英文官网 .NET Core 微软中文官网 GitHub 用ASP.NET内核和Azure构建现代Web应用程序 博客 ...