官方描述:

根据系统窗体里的元素比如状态栏来调整View的布局。如果被设为true,控件的padding将会被调整为顶部留出一个statusBar的空间。类似于伪代码paddingTop="statusBarHeight"。

重点说明:

当布局内容可以延伸到状态栏,被状态栏覆盖时(比如设置了View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,默认不会有这个flag,布局不会延伸到状态栏下),该属性才会起作用

静态布局中多个View的fitSystemWindows都为true,只对最外层(如同层,则为第一个)的View起作用

动态添加子View过程中,只会对第一次添加的子View起作用

上述2、3点和官方描述的行为都是默认行为,而这个行为可以通过自定义View来进行个性化,比如CoordinateLayout就重载了这种行为(可以参考下方链接文章)

多Fragment时fitSystemWindows无效的坑

最近一个项目中,有几个界面是一个Activity装载多个Fragment的形式,为了实现沉浸式布局,将Activity的decorView加上View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(使布局延伸到状态栏),所有Fragment的布局中,则将在最顶部的View(比如Toolbar)的fitSystemWindows设为true。 却惊讶地发现,只有第一个被加入到Activity的Fragment显示正常,随后被添加的Fragment都适配错误,如下图:

原因

添加Fragment的过程可看作往容器布局添加子View的过程。当第一个Fragment被添加到容器布局时,容器布局找出fitSystemWindows为true的子View,并为其paddingTop一个状态栏的高度,当其他Fragment随后被添加时,上述的paddingTop适配已经被消费过一次,并不会再为其后添加的View进行适配(默认行为),因此我们要自定义容器布局View,使其每个子View都消费一次ViewGroup分发的WindowsInsets,相当于每个子Fragment都能适配状态栏

注意

此方法实现的布局容器会对其每个子View都适配一次

实现代码

我一般用FrameLayout作为容器布局,因此继承了FrameLayout,每次addView都requestApplyInsets请求分发WindowInsets,并且保存当前添加的子View,在重载方法onApplyWindowInsets中调用子View的dispatchApplyWindowInsets,使每个子View都有机会消费一次insets

class WindowInsetsFrameLayout: FrameLayout {

private var requestView: View? = null

constructor(context: Context): this(context, null)

constructor(context: Context, attrs: AttributeSet?): this(context, attrs, 0)

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr) {

setOnHierarchyChangeListener(object : OnHierarchyChangeListener {

override fun onChildViewAdded(parent: View?, child: View?) {

requestView = child

requestApplyInsets() //子View添加时申请解析inset

}

override fun onChildViewRemoved(parent: View?, child: View?) {}

})

}

override fun onApplyWindowInsets(insets: WindowInsets?): WindowInsets? {

val t = requestView

return if (t == null) {

super.onApplyWindowInsets(insets)

} else {

val res = t.dispatchApplyWindowInsets(insets) //子View解析

requestView = null

res

}

}

}

复制代码

参考链接

android system window,Android控件的fitSystemWindows属性相关推荐

  1. 解决Android Studio不提示控件的XML属性

    大家好:我国著名数学家华罗庚先生曾经说过:"聪明出于勤奋,天才在于积累."衷心希望各位坚守本心,实现中华民族伟大复兴的中国梦! 一.问题背景 上一篇文章向大家介绍了如何利用WPS使 ...

  2. android system window,Android之属性fitsSystemWindows

    页面有输入框时都要考虑会不会被键盘挡住,于是fitsSystemWindows属性就派上了用场 属性说明 fitsSystemWindows属性可以让view根据系统窗口来调整自己的布局:简单点说就是 ...

  3. android ui界面组件,说说 Android 的常见 UI 控件

    这些控件都有一些共有属性,让我们来看看吧: 共有属性 说明 android:id 唯一标识符 android:layout_width 宽度 android:layout_height 高度 andr ...

  4. Android学习:常用控件

    Android学习:常用控件 学习要点:掌握文本框.编辑框.按钮.单选按钮.复选框等基本控件的用法 控件是Android应用程序中用户界面的重要组成元素,正是因为Android应用程序提供了很多具有不 ...

  5. Android拼图滑块验证码控件

    大咖好,博主毕业工作半年多了.今天给大噶呈献博主博客处女作--Android拼图滑块验证码控件.由于初写博客,很多地方可能不够好,望各位多多给点意见.工作半年才送出第一篇博客很惭愧555. 概述 验证 ...

  6. Android 滑动拼图验证码控件

    Android 滑动拼图验证码控件 简介: 很多软件为了安全防止恶意攻击,会在登录/注册时进行人机验证,常见的人机验证方式有:谷歌点击复选框进行验证,输入验证码验证,短信验证码,语音验证,文字按顺序选 ...

  7. 小视频app源码,Android 滑动拼图验证码控件

    小视频app源码,Android 滑动拼图验证码控件 代码实现: 滑块视图类:SlideImageView.java.实现小视频APP源码随机选取拼图位置,对拼图位置进行验证等功能. public c ...

  8. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  9. Android仿照薄荷appBMI控件实现

    Android仿照薄荷appBMI控件实现 BMI原图和实现的效果图 BMI控件的实现 在XML中自定义属性 在java代码中自定义view 使用自定义控件 添加背景和虚线分割线 结语 BMI原图和实 ...

最新文章

  1. 复习计算机网络day2
  2. 零基础学stm32要多久?stm32应该怎么学?
  3. 新视频超分算法来了:CVPR 2021 NTIRE 2021 冠军
  4. camel_Meet Fabric8:基于Camel和ActiveMQ的开源集成平台
  5. 使用face_recognition(二)目标人脸“实时”检测
  6. 如何替换 Ubuntu 11.10 登录屏幕背景和logo
  7. [iphone-tabbar]如何自定义TabBarController
  8. php中 和 的优先级,理解php中的运算符优先级
  9. jstree中文api文档_还在用 Swagger(丝袜哥)生成接口文档?我推荐你试试它。。。...
  10. [译] 第十一天: AeroGear Push Server - 轻松推送提示信息
  11. 最简单的delphi启动画面(转)
  12. php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
  13. Docker容器系列教程(三):jenkins环境搭建与插件安装
  14. Kubernetes 小白学习笔记(11)--搭建一个kubernetes集群-为worker节点配置命令行交互环境
  15. 原生HTML table样式设置大全
  16. LAMP一键安装包是什么?
  17. pulseaudio,gmediarender
  18. 微信小程序---简约音乐播放器
  19. 【钉钉-场景化能力包】IoT物联网设备协同
  20. 直线与直线、直线与圆、直线与矩形的交点

热门文章

  1. 如何评判软件测试培训机构的好坏?
  2. 混淆梯度(Obfuscated Gradients Give a False Sense of Security Circumventing Defense)
  3. 个人怎么发表期刊具体细节
  4. 【解决】MySql 5.6 运行崩溃错误
  5. 你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施
  6. 深入Jetty源码之HTTP协议
  7. 个人随笔——衰人自叙卷壹
  8. Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三
  9. matlab操作入门实验报告,MATLAB基本操作实验报告.doc
  10. 解决Ubuntu系统下git clone下载速度较慢的问题(亲测有效)