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); } }
我们在新的CoordinatorLayout
或AppBarLayout
看到相同的模式。
这不正是与fitsSystemWindows
的文档完全相反的方式吗? 在最后的情况下,这意味着在系统栏后面绘制 。
然而,如果你想要一个FrameLayout
在状态栏后面绘制自己,设置fitsSystemWindows
为true并不会执行这个技巧,因为默认的实现是在最初logging的。 你必须覆盖它,并添加与其他提到的类相同的标志。 我错过了什么吗?
它不会在系统栏后面绘制它在条形后面延伸以使其具有相同的颜色,但是它包含的视图会填充到状态栏中,如果这是有意义的
系统窗口是系统正在绘制的屏幕的一部分,既可以是非交互式(就状态栏而言),也可以是交互式(就导航栏而言)的内容。
大多数情况下,您的应用程序不需要在状态栏或导航栏下绘制,但是如果您这么做:您需要确保交互式元素(如button)不会隐藏在其下面。 这就是android:fitsSystemWindows =“true”属性的默认行为:它设置View的填充以确保内容不覆盖系统窗口。
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec