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);

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对Devmax的支持。

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

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. 使用UINavigationController进行iOS 7自定义当前转换

    解决方法我有同样的问题,并解决了在设置此框架之前将toViewController添加到容器.反转如下的行:

  6. iOS – UINavigationController,隐藏navigationBar

    快速以及obj-c的答案非常受欢迎编辑:我试过以下各种版本,问题依然存在–.-编辑2:打印:在viewDidLoad返回20之后解决方法更新:只需在ViewDidLoad方法中添加它即可

  7. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  8. ios – TabBarController上的彩色状态栏,导航栏无法正常工作

    我在这里阅读了很多帖子,并尝试了大多数提到的选项,但没有人为我解决问题.我有一个基于标签栏控制器的应用程序.每个选项卡都是一个UIViewController,顶部有一个导航栏.将此代码添加到AppDelegate为我提供了带有白色文本的橙色导航栏,但是带有黑色文本的白色状态栏.阅读各种页面上的答案建议将以下内容添加到View控制器:然后在ViewDidLoad中调用它:这让我得到一个带有白色文本的白色状态栏,我现在如何让状态栏变为橙色以匹配我的导航栏?

  9. ios – 状态栏大小错误,包含UINavigationController

    这是你永远不应该做的事情.只需将这些行添加到您的代码中:现在导航控制器的视图有一个框架,并相对于其超视图维护它.

  10. ios – 导航工具栏从全屏视频返回后垂直延伸

    第一个屏幕截图是在全屏播放视频之前拍摄的.第二个是在视频全屏打开并关闭后拍摄的.知道为什么导航工具栏有扩展吗?注意:汉堡包按钮不是导航项目的一部分.它在父级的覆盖中伪造,将其子控制器保存在标准容器中.源内没有什么特别之处:更新:这似乎仅在最新版本的iOS9.3上存在问题解决方法从截图中看,状态栏的高度看起来会加倍.试试这个:-在播放视频之前,请隐藏状态栏结束视频后,显示状态栏

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部