关于 Android 状态栏的适配总结
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 状态栏的适配总结的更多相关文章
- Android开发 android沉浸式状态栏的适配(包含刘海屏)转载
原文地址:https://blog.csdn.net/liup1211/article/details/86583015 写在前面: 1,本文阐述如何实现沉浸式状态栏 2,部分代码有从其他博客摘抄,也 ...
- Android 关于屏幕适配
android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 转自:http://www.c ...
- Android刘海屏适配 ----- ImmersionBar
android 4.4以上沉浸式状态栏和沉浸式导航栏管理,适配横竖屏切换.刘海屏.软键盘弹出等问题,可以修改状态栏字体颜色和导航栏图标颜色,以及不可修改字体颜色手机的适配,适用于Activity.Fr ...
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android状态栏颜色修改
android状态栏颜色修改 状态栏颜色的修改在4.4和5.x环境下分别有不同的方式,低于4.4以下是不能修改的. 5.x环境下 方式一,状态栏将显示为纯净的颜色,没有渐变效果 /** * 状 ...
- 老李分享:android手机测试之适配(1)
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- Android状态栏透明(沉浸式效果)
Android状态栏透明(沉浸式效果) 默认效果 沉浸式效果 方式一 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487880 ...
- Android状态栏着色
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 状态栏着色,也就是我们经常听到的沉浸式状态栏,关于沉浸式的称呼网上也有很多吐槽的,这里就不做过多讨论了,以下我们统称状态栏着色,这样 ...
- android状态栏和NavigationBar的动态控制显示
项目在开发阅读器,阅读器对阅读界面的要求就是在工具栏不显示的状态下,ActionBar和NavigationBar都是不显示的,当工具栏显示时它们都出来,这就需要动态控制它们的显示与隐藏. 第一阶段: ...
随机推荐
- 关于hover与after,before已及first-letter,first-line的联用
0920自我总结 关于hover与after,before已及first-letter,first-line的联用 一.写法 元素:hover::after{样式} 元素:hover::before{ ...
- oracle12.2RAC之OGG安装配置(二)
本机到本机的配置: 源端 10.1.83.144:1521/SIBP_GSDY HNSIB_GSDY目标端 10.1.83.144:1521/SIBP_GS HN ...
- docker swarm 删除节点
有时临时在 docker swarm 集群上增加节点,过后需要删除节点 # 获取 node 信息 docker node ls ID HOSTNAME STATUS AVAILABILITY MANA ...
- Linux下的 mariadb 使用 root 用户启动方式
近日因测试安全产品需要,想调整mariadb的启动用户为root, 经历一番波折后终于成功! 注意:以root身份启动mysql是一项非常危险行为,相当于给了数据库操作用户(数据库管理员或黑客)一个通 ...
- Windows 10 任务栏添加网易云音乐控制按钮
软件背景: 算是老帖新发,之前有朋友分享过一个很好用的工具,但可能是因为网易云软件更新后,导致控件失灵了,只剩下歌词控件有用了,所以今天用python重新写了一个小工具,发出来分享给大家,附上之前 ...
- numpy和matplotlib的pyplot函数的简单应用实现
- python中可变与不可变类型的全局变量
python中的不可变类型的全局变量如int a=1,str b='hello', 若需要修改必须加global申明, 而全局变量是可变类型的,如list, dict ,则直接修改list.app ...
- 【oracle】查看表空间对应文件所在位置
select file_name , tablespace_name from dba_data_files;select * from dba_data_files;
- "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)
题目大意: n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人 问最少有几场游戏 题解: 二分 答案范围:[0,sigma a[i]] check:首先a[i]>=ans,其次 ...
- IDEA debug工具使用
参考:https://www.cnblogs.com/jajian/p/9410844.html