无法获得透明系统栏的正确行为 + FAB + BottomNavigationView + SnackBar
Can't get proper behavior for transparent system bars + FAB + BottomNavigationView + SnackBar
我见过最多三个这些东西的各种组合的解决方案,但不是一次全部四个。
期望的行为是 FAB 位于 BottomNavigationView 上方,如果出现 SnackBar,它将 FAB 向上推并出现在 BottomNavigationView 上方。
我尝试过的:
BottomNavigationView和FAB都在CoordinatorLayout中。 FAB 锚定到 BottomNavigationView,因此它可以位于其上方。为了使 SnackBar 出现在 BottomNavigationView 上方而不是前面,它通过 setAnchorView
将其用作锚点,但这会导致它不会推送 FAB。
BottomNavigationView 使用 LinearLayout 位于 CoordinatorLayout 下方。 FAB 没有锚点,因此 SnackBar 可以推送它。但是当 SnackBar 出现时,它会向上滑动太远。它试图避开底部 window 插图,但假设 CoordinatorLayout 与屏幕底部对齐。
为了解决第 2 个问题,我尝试在 CoordinatorLayout 的底部放置一个零高度视图,并在显示它之前将其设置为 SnackBar 的锚点。从查看 SnackBar 行为的源代码来看,这似乎是让它忽略 window 插入的唯一方法。但是当 SnackBar 锚定到某物时,它不会推动 FAB。 (与第 1 个问题相同)
我看到 他们说它已解决,这样你会认为上面的第 1 条可以工作,但那是 BottomAppBar,而不是 BottomNavigationBar,它没有任何交互行为与 FAB。
顺便说一下,无论 fitsSystemWindows
设置如何,BottomNavigationView 似乎也坚持为 window 调整其填充,因此数字 2 的布局更可取。
这就是为什么 FloatingActionButtons 在 SnackBar 有锚点时不会自动躲避 SnackBar 的原因。如果添加的视图的 LayoutParams 的 insetEdge
设置为 Gravity.BOTTOM
,CoordinatorLayout 将处理推送 FloatingActionButton。 SnackBar(实际上是它的超类)自动将 insetEdge
设置为 Gravity.BOTTOM
、but only if it has no anchor view.
所以解决这个问题的方法是在创建底部有锚点的 SnackBar 时手动设置插入边缘:
Snackbar.make(binding.coordinatorLayout, text, duration)
.apply {
anchorView = binding.bottomEdgeAnchor
(view.layoutParams as CoordinatorLayout.LayoutParams).insetEdge = Gravity.BOTTOM
show()
}
那我按照原题中的选项3。
我见过最多三个这些东西的各种组合的解决方案,但不是一次全部四个。
期望的行为是 FAB 位于 BottomNavigationView 上方,如果出现 SnackBar,它将 FAB 向上推并出现在 BottomNavigationView 上方。
我尝试过的:
BottomNavigationView和FAB都在CoordinatorLayout中。 FAB 锚定到 BottomNavigationView,因此它可以位于其上方。为了使 SnackBar 出现在 BottomNavigationView 上方而不是前面,它通过
setAnchorView
将其用作锚点,但这会导致它不会推送 FAB。BottomNavigationView 使用 LinearLayout 位于 CoordinatorLayout 下方。 FAB 没有锚点,因此 SnackBar 可以推送它。但是当 SnackBar 出现时,它会向上滑动太远。它试图避开底部 window 插图,但假设 CoordinatorLayout 与屏幕底部对齐。
为了解决第 2 个问题,我尝试在 CoordinatorLayout 的底部放置一个零高度视图,并在显示它之前将其设置为 SnackBar 的锚点。从查看 SnackBar 行为的源代码来看,这似乎是让它忽略 window 插入的唯一方法。但是当 SnackBar 锚定到某物时,它不会推动 FAB。 (与第 1 个问题相同)
我看到
顺便说一下,无论 fitsSystemWindows
设置如何,BottomNavigationView 似乎也坚持为 window 调整其填充,因此数字 2 的布局更可取。
这就是为什么 FloatingActionButtons 在 SnackBar 有锚点时不会自动躲避 SnackBar 的原因。如果添加的视图的 LayoutParams 的 insetEdge
设置为 Gravity.BOTTOM
,CoordinatorLayout 将处理推送 FloatingActionButton。 SnackBar(实际上是它的超类)自动将 insetEdge
设置为 Gravity.BOTTOM
、but only if it has no anchor view.
所以解决这个问题的方法是在创建底部有锚点的 SnackBar 时手动设置插入边缘:
Snackbar.make(binding.coordinatorLayout, text, duration)
.apply {
anchorView = binding.bottomEdgeAnchor
(view.layoutParams as CoordinatorLayout.LayoutParams).insetEdge = Gravity.BOTTOM
show()
}
那我按照原题中的选项3。