1.要求状态栏透明,我们的内容布局延伸到系统状态栏,就是人们口中说的沉浸式状态栏:

Android 5.0 及其以后版本:设置属性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 使得我们的内容布局可以延伸到系统状态栏,然后直接使用方法 setStatusBarColor() 把系统状态栏设置成透明就好了。

Android 4.4 ~ Android 5.0 :添加了属性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) 可以让状态栏变成透明,并且使我们们的内容布局延伸到系统状态栏。这个属性虽然也可以在 Android 5.0 及其以后版本的手机上使用,但是效果不是我们想要的。

在 Android 4.4 之前是不支持透明状态栏

需要注意的一点是在设置透明状态栏的情况下,是需要我们的内容布局延伸到状态栏的,因此这个时候使用 fitSystemWindows 这个属性是没有意义的,只会使得出现各种奇葩的效果。

2.状态栏颜色和我们布局颜色搭配

其实在有的时候,我们是不需要把我们的内容布局延伸到系统状态栏的,只是需要系统状态栏和我们的内容布局的颜色搭配起来。

Android 5.0 及其以后版本:直接通过 setStatusBarColor() 或者 修改colorPrimaryDark 对应的颜色,把系统状态栏颜色设置成搭配的颜色就可以了

Android 4.4 ~ Android 5.0:这个版本其实是不允许直接修改状态栏的颜色的,只不过我们利用了一种巧妙的方法,感觉是修改了状态栏的颜色而已。通过 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS) 是状态栏透明,并且我们的布局也会延伸到状态栏,给我们的内容布局设置一个 padding,给这个 padding 设置一个合适的颜色来充当系统状态栏的颜色就可以了。

Android 4.4 之前是不支持修改的

其实状态栏的适配无外乎这两点了,注意一定要针对不同的 Android 版本使用不同的方法,不可乱用,不可混用,不然会有各种奇葩效果!

效果图

Android 4.4 以前

状态栏永远是黑底白字,没有方法改变。上面的所有的方法也是不适用的。

Android 4.4~Android 5.0

Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 这种模式,使用这种模式可以使内容布局占据状态栏,效果:

android:fitsSystemWindows = "true" 属性
可以理解为给所使用的布局设置了状态栏大小的 padding。只会作用于 Toolbar 和 根布局。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/main_green_00b661"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- <android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tb"
app:title="@string/activity_status_bar"
app:titleTextColor="@android:color/white"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:background="@color/colorAccent">
</android.support.v7.widget.Toolbar>-->
<TextView
android:fitsSystemWindows="true"
android:background="@color/main_green_00b661"
android:layout_width="match_parent"
android:layout_height="1dp"
android:text="11"
android:textColor="#000"/>
<ImageView
android:contentDescription="@string/text_input"
android:id="@+id/iv"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@mipmap/imga"/>
<TextView
android:background="@color/colorAccent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11"
android:textColor="#000"/>
</LinearLayout> 比如,布局是这样的,fitsSystemWindows 只有在根布局 LinearLayout 或者 ToolBar 上有用,在别的 View 上使用是没有效果的。

LinearLayout 使用 fitsSystemWindows

ToolBar 设置 fitsSystemWindows 效果

可以看到效果了。其实就是相当于给布局设置了 padding top(高度相当于系统状态栏的高度),但是考虑到兼容性的问题,如果你直接在布局中设置 paddingtop 而不是通过 FitsSystemWindows 这个属性,那么在 Android 4.4 以下的手机上运行的话,那么效果就很糟糕了,因为 Android 4.4 以下的手机,系统状态栏都是始终存在的,也就是说,这样始终比 Android 4.4 以上系统的手机布局多一块 padding ,因为这一块 padding 没法在系统状态栏上。但是使用 fitsSystemWindo 就会完美适配了,因为这个属性在 Android 4.4 以下的系统上是不起作用的。注意在使用 fitsSystemWindow 的时候,颜色问题,不同的手机系统,可能会造成延伸到状态栏的那一块颜色不同,理论上颜色应该和根布局的颜色一样。

Android 5.0

到了 Android 5.0 关于状态栏又发生了变化,新增了直接对状态栏的操作,直接改变状态栏颜色,这一点在之前版本是没有的,Android 4.4 虽然可以实现改变状态栏颜色的效果,但其实实际上是将我们的布局占据了状态栏,然后状态栏是透明的。其实颜色还是我们布局的颜色。

对 Android 5.0 的采取

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面对 Android 4.4 的方法是一样的);

效果图:

Android 6.0

在 Android 6.0 添加了可以更改状态栏字体颜色的方法,别的都是和 Android 5.0 一样的。

状态栏字体颜色默认是白色。可以修改为黑色。

方法:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// 方法
/*
* 当 insets 视图插入,window 已经更改了,视图层次结构调用。允许它调整内容来适应这些窗口。这个 insets 会告诉我们 status bar、input method 和其他系统 window 的空间。 通常情况下我们是不需要处理此功能的,因为应用程序的默认窗口修饰会将其应用于窗口内容。如果我们使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 或者 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 的时候,则需要处理这个函数了,这个时候如果我们不处理,我们的视图内容就会默认放在系统视图的下面。如果我们希望系统视图不覆盖UI的某些部分,则可以在视图层次结构中使用此方法。
默认情况下,只是将 insets(将 insets 设置为 0 )做为 View 的 padding。并且返回true。默认情况下,此行为是关闭的,但是可以通过 setFitsSystemWindows(boolean)启用。 此功能在层次结构中的遍历是深度优先的。 相同的内容insets对象沿着层次结构向下传播,因此对其所做的任何更改都将被所有后续视图看到(包括层次结构中的上层视图,因为这是深度优先遍历)。 返回true的第一个视图将中止整个遍历。 */
fitSystemWindows(Rect insets);

关于 Android 状态栏的适配总结的更多相关文章

  1. Android开发 android沉浸式状态栏的适配(包含刘海屏)转载

    原文地址:https://blog.csdn.net/liup1211/article/details/86583015 写在前面: 1,本文阐述如何实现沉浸式状态栏 2,部分代码有从其他博客摘抄,也 ...

  2. Android 关于屏幕适配

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 转自:http://www.c ...

  3. Android刘海屏适配 ----- ImmersionBar

    android 4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换.刘海屏.软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色,以及不可修改字体颜色手机的适配,适用于Activity.Fr ...

  4. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  5. Android状态栏颜色修改

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

  6. 老李分享:android手机测试之适配(1)

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

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

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

  8. Android状态栏着色

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 状态栏着色,也就是我们经常听到的沉浸式状态栏,关于沉浸式的称呼网上也有很多吐槽的,这里就不做过多讨论了,以下我们统称状态栏着色,这样 ...

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

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

随机推荐

  1. 教你用Python实现免费蹭WiFi,只要有WiFi的地方,你就不会断网!

    想象一下,程序员没有WIFI会怎样? 程序员没有网络肯定会寸步难行! 但是对于Python程序员来说,只要附近有热点,分分钟就能蹭网成功! 想要WIFI破解,python+字典,这是必少不了的.热点加 ...

  2. Go-包

    Go-包 包的介绍以及使用 为什么使用包 为了更加好的维护代码 包的位置 必须再GOPATH路径的src中 能导入的内容 导入的内容名称必须是大写字母开头不然无法导入 包 src中的一个文件夹为一个包 ...

  3. DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件

    场景 使用DevExpress的TreeList显示本磁盘下文件目录并在树节点上右键实现删除与添加文件. 效果 自定义右键效果 实现 首先在包含Treelist的窗体的load方法中对treelist ...

  4. Easy User Manager System writeup

    0x01 解题 思路 一个进程用自己的ip去申请拿到code然后进入verify页面,另外一个进程去申请8.8.8.8 步骤 1. 首先注册一个账号 然后用两个不同的浏览器进入Change页面.这里我 ...

  5. This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value

    iOS10 11之后遇到这种报错的小伙伴们请注意啦: 你会发现网上一大堆博客和论坛都是让你在  Info.plist 里面要涉及隐私数据时要添加一句“提示语”.于是打开 Info.plist,点击 + ...

  6. 数据结构笔记1(c++)_指针

    一.数据结构概述 1.定义: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排 ...

  7. Educational Codeforces Round 74 (Rated for Div. 2)

    传送门 A. Prime Subtraction 判断一下是否相差为\(1\)即可. B. Kill 'Em All 随便搞搞. C. Standard Free2play 题意: 现在有一个高度为\ ...

  8. 201871010132--张潇潇--《面向对象程序设计(java)》第十三周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  9. Deepin 15.9系统直接运行exe运行程序

    以下为你介绍在深度Deepin 15.9 Linux操作系统下直接运行exe文件的方法,此方法基于deepin-wine实现,经测试,一些exe文件是可以正常打开的,但部分可能会出现无法使用的情况,但 ...

  10. Acwing 14. 不修改数组找出重复的数字

    题目地址  https://www.acwing.com/problem/content/description/15/ 来源:剑指Offer 给定一个长度为 n+1n+1 的数组nums,数组中所有 ...