Using a 持久底表 https://material.google.com/components/bottom-sheets.html#bottom-sheets-persistent-bottom-sheets,在一个协调器布局 https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html,当 BottomSheet 处于其状态时,如何防止 BottomSheet 覆盖其他用户界面元素倒塌 https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_COLLAPSED又名偷看状态?
我已成功将 BottomSheet 添加到我的导航抽屉和基于片段的应用程序;但是,如上所述,当 BottomSheet 处于以下任一状态时,它会覆盖我的片段容器中的用户界面元素:倒塌 https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_COLLAPSED or EXPANDED https://developer.android.com/reference/android/support/design/widget/BottomSheetBehavior.html#STATE_EXPANDED
当 BottomSheet 展开时,覆盖部分片段是可以的,因为如果需要,用户可以将 BottomSheet 折叠到其查看状态。但是,我已明确禁止*用户隐藏 BottomSheet,因此需要一种方法来确保当 BottomSheet 处于折叠状态时片段容器始终保持在 BottomSheet 之上。照片胜过千言万语,希望以下内容能澄清这个问题
上图:经过编辑的片段屏幕截图,靠近屏幕底部有两个按钮 A 和 B。注意:该片段的根是滚动视图,这就是为什么按钮 B 被系统的“后退”和“主页”按钮切断的原因
上图:与上图相同的片段,但 BottomSheet 完全展开。作为参考,BottomSheet 是下面的所有内容,包括绿色条。注意:BottomSheet 覆盖按钮 A 和 B 是可以的,因为 BottomSheet 已完全展开
上图:与上图相同的片段,但 BottomSheet 处于折叠状态。注意:现在 BottomSheet 已完全折叠并且无法进一步折叠,可以看出问题在于它覆盖了按钮 B 的一部分,更重要的是片段在 BottomSheet 下方滚动
最初我希望通过子类化来解决问题AppBarLayout.ScrollingViewBehavior https://developer.android.com/reference/android/support/design/widget/AppBarLayout.ScrollingViewBehavior.html与此类似answer https://stackoverflow.com/a/40465215/1406986。遗憾的是我无法调整child
view's height
within CoordinatorLayout.Behavior#onDependentViewChanged https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.Behavior.html#onDependentViewChanged(android.support.design.widget.CoordinatorLayout,%20V,%20android.view.View)。当被调用时,child
's height
似乎未设置(-1
)并添加一个OnLayoutChangedListener
需要child
to be final
导致无法更新height
一旦height
在布局更改侦听器回调中定义。我仍然想使用子类来解决问题Behavior https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.Behavior.html但目前我很困惑
我的下一个想法是使用以下命令向我的每个片段布局添加一个“间隔”视图<include/>
标签。然后我可以提供add/show
and remove/hide
辅助方法abstract
需要显示 BottomSheet 的所有片段都将扩展的基本片段类。该间隔视图将以编程方式分配peek height
BottomSheet 的大小在片段内为其腾出空间。然后,BottomSheet 将覆盖间隔视图,这很好,因为我不认为它是片段可用视图区域的一部分。我目前正在努力实施这种方法,虽然我认为它会起作用,但我怀疑这是一个好的解决方案
欢迎任何意见、建议和潜在的解决方案,并提前致谢!
为了澄清,下面是我的顶级应用程序布局的精简版本
<android.support.v4.widget.DrawerLayout>
<android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.AppBarLayout>
<android.support.design.widget.CollapsingToolbarLayout>
<ImageView ... />
<android.support.v7.widget.Toolbar ... />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- All fragments assume the following view container via a FragmentTransaction's
replace method which in pseudocode looks something like
FragmentTransaction.replace(R.id.main_activity_fragment_container,
fragment, ...).commit();
-->
<FrameLayout android:id="@+id/main_activity_fragment_container" ... />
<com.xyz.abc.view.BottomSheetView ... />
<android.support.design.widget.FloatingActionButton ... />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView ... />
</android.support.v4.widget.DrawerLayout>
*它出现BottomSheetBehavior#mHideable}
is false
默认情况下