什么是 fitsSystemWindows
System windows 是指屏幕中系统渲染的部分,包括不可交互的部分(如状态栏)或者可交互的部分(如屏幕底部的虚拟按键导航栏)。
一般情况下,应用不需要在这些系统UI的位置进行绘制。而一旦应用有这种需求,便需要保证不被系统UI控件(如状态栏、导航栏)盖住应用的交互控件(例如应用中的一个按钮)。这就是 fitsSystemWindows
所做的事情,它为应用的控件设置额外的 padding,以确保其位于系统控件的范围之外。
BEFORE (API LEVEL <= 19)
fitSystemWindows() 从最外层的 View 中开始被调用,然后一旦某个 View 消耗掉这个事件,其子 View 不会再收到 fitSystemWindows 回调。
AFTER (API LEVEL >= 20)
fitSystemWindows()
被废弃,取而代之,此时被重写的方法应该是 onApplyWindowInsets()
,在你重写的方法中,你可以消耗掉任意大小的 insets,然后把剩下的 insets 用 dispatchApplyWindowInsets()
方法传递给下一层。
关于此特性的应用
Android Design Library 中,CoordinatorLayout
CollapsingToolbarLayout
等 ViewGroup 均使用了此特性。当你使用 Design Library 出现应用界面被系统 UI 遮住的情况时,很可能就是没有正确地指定 fitSystemWindows
。
REF
[1] Why would I want to fitsSystemWindows? — Google Developers — Medium
[2] http://stackoverflow.com/questions/31190612/fitssystemwindows-effect-gone-for-fragments-added-via-fragmenttransaction/34345286#34345286