简洁版本:
我该如何设置NestedScrollingChild
of a NestedScrollingParent
有多个这样的孩子。
长版
我实现了一个BottomSheetDialogFragment
其布局由ViewPager
,这个viewpager的适配器包含一个RecyclerView
.
现在的问题是,既然NestedScrollingParent
此时底部表的协调器布局仅支持一个direct NestedScrollingChild
,只有适配器的第一个片段可以嵌套滚动。
我的意思是,每当setAdapter
在viewpager上调用,第一项支持嵌套滚动。但是当我更改页面后,新页面现在不会滚动。然后当我返回上一页时,它仍然支持滚动。
另外,我注意到,如果可以滚动的片段或页面被破坏,则后续页面现在可以滚动,这意味着后一页成为底部工作表的滚动子项。问题是现在获得滚动能力的页面不是当前项目,而是前一个项目(我的适配器必须维护3个片段).
Summary:
After setAdapter
- 片段0可以滚动
- 然后将页面更改为片段1后,片段1无法滚动
- 但切换到片段 2,然后返回片段 1 允许片段 1 滚动(因为我猜片段 0 已被破坏)
在深入研究源代码后,我发现问题在于用于查找的错误算法NestedScrollingChild
底页的(谷歌的人没有考虑到ViewPager
位于底页内)。
请参阅此处的方法:找到ScrollingChild() https://github.com/android/platform_frameworks_support/blob/master/design/src/android/support/design/widget/BottomSheetBehavior.java#LC600
这个方法的作用是返回第一个NestedScrollingChild
它在给定视图(本例中为底页)上遇到,在具有 3 页的视图分页器的情况下,即当前页面之前的一页。此外,该方法在子级的布局阶段被触发。CoordinatorLayout
底片的包装纸。
考虑到这一点,我们可以设计出许多解决方案,包括对行为本身进行子类化。
此外,还可以限制NestedScrollingChild
在 viewpager 中添加和删除此类子项的一个实例(从旧页面中删除,然后添加到当前页面中),这就是我所做的。你可以在里面做这个setPrimaryItem
适配器或在OnPageChangeListener
。请务必致电requestLayout
在底部表的协调器布局上。 (此解决方案取决于寻呼机适配器的布局/结构类型,因此我不会发布我的确切解决方案)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)