fitsSystemWindows究竟做了什么?

我正在努力理解fitsSystemWindows的概念,因为它依赖于视图执行不同的事情。 根据官方文件,这是一个

布尔型内部属性可根据系统窗口(如状态栏)调整视图布局。 如果为true,则调整此视图的填充以为系统窗口留出空间

现在,检查View.java类,我可以看到,当设置为true ,窗口插件(状态栏,导航栏…)被应用到视图填充,根据上面引用的文档工作。 这是代码的相关部分:

 private boolean fitSystemWindowsInt(Rect insets) { if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) { mUserPaddingStart = UNDEFINED_PADDING; mUserPaddingEnd = UNDEFINED_PADDING; Rect localInsets = sThreadLocal.get(); if (localInsets == null) { localInsets = new Rect(); sThreadLocal.set(localInsets); } boolean res = computeFitSystemWindows(insets, localInsets); mUserPaddingLeftInitial = localInsets.left; mUserPaddingRightInitial = localInsets.right; internalSetPadding(localInsets.left, localInsets.top, localInsets.right, localInsets.bottom); return res; } return false; } 

随着新的材料devise有新的类,广泛使用这个标志,这是混乱的地方。 在许多资源中,系统fitsSystemWindows被提到作为标志来设置系统背后的视图。 看到这里 。

ViewCompat.java中的setFitsSystemWindows文档说:

设置此视图是否应考虑系统屏幕装饰(如状态栏和插入其内容); 即控制是否将执行{@link View#fitSystemWindows(Rect)}的默认实现。 请参阅该方法了解更多详情

据此, fitsSystemWindows只是意味着函数fitsSystemWindows()将被执行? 新的“材质”类似乎只是将其用于在状态栏下进行绘制。 如果我们看一下DrawerLayout.java的代码,我们可以看到:

 if (ViewCompat.getFitsSystemWindows(this)) { IMPL.configureApplyInsets(this); mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context); } 

 public static void configureApplyInsets(View drawerLayout) { if (drawerLayout instanceof DrawerLayoutImpl) { drawerLayout.setOnApplyWindowInsetsListener(new InsetsListener()); drawerLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } } 

我们在新的CoordinatorLayoutAppBarLayout看到相同的模式。

这不正是与fitsSystemWindows的文档完全相反的方式吗? 在最后的情况下,这意味着在系统栏后面绘制

然而,如果你想要一个FrameLayout在状态栏后面绘制自己,设置fitsSystemWindows为true并不会执行这个技巧,因为默认的实现是在最初logging的。 你必须覆盖它,并添加与其他提到的类相同的标志。 我错过了什么吗?

它不会在系统栏后面绘制它在条形后面延伸以使其具有相同的颜色,但是它包含的视图会填充到状态栏中,如果这是有意义的

系统窗口是系统正在绘制的屏幕的一部分,既可以是非交互式(就状态栏而言),也可以是交互式(就导航栏而言)的内容。

大多数情况下,您的应用程序不需要在状态栏或导航栏下绘制,但是如果您这么做:您需要确保交互式元素(如button)不会隐藏在其下面。 这就是android:fitsSystemWindows =“true”属性的默认行为:它设置View的填充以确保内容不覆盖系统窗口。

https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec