如何禁用 ViewPager2 中的滑动?
Posted
技术标签:
【中文标题】如何禁用 ViewPager2 中的滑动?【英文标题】:How to disable swiping in ViewPager2? 【发布时间】:2019-07-25 12:08:42 【问题描述】:是否可以在新的android viewpager2
组件中启用-禁用滑动?
【问题讨论】:
【参考方案1】:在幕后ViewPager2
与RecyclerView
一起使用来膨胀片段视图,但RecyclerView
是隐藏的,因此它们更加防白痴。
val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)
Hacky 方法是通过包装布局管理器让子级位于位置零(即RecyclerView
)并禁用布局管理器中的滚动:
inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout)
override fun canScrollVertically(): Boolean = layoutManager.orientation == HORIZONTAL
override fun canScrollHorizontally(): Boolean = layoutManager.orientation == VERTICAL
请注意,如果 API 更改了用于 RecyclerView 的布局管理器,即它们从 LinearLayoutManager
移开,这将不起作用,它需要重写一些方法并确保调用超级方法。
第二种方法是将ViewPager2
子类化,即ViewGroup
,然后在将触摸事件分派到子视图之前执行魔术拦截(正如您猜到的RecyclerView
)并注意不要阻止点击。
【讨论】:
子类是不可能的,因为 viewPages2 是最终的。 @Guy 在发布我的答案时,ViewPager2 已打开。 抱歉,创建一个单独的类是不好的做法。 Kotlin 和 VP2 提供了这个简短的单行代码pager.userInputEnabled = false
【参考方案2】:
现在可以使用Version 1.0.0-alpha02
启用-禁用滑动viewpager2
使用implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'
Version 1.0.0
新功能
能够禁用用户输入(setUserInputEnabled
、isUserInputEnabled
)
API 更改
ViewPager2
类决赛
错误修复
FragmentStateAdapter
稳定性修复
在 viewpager2 中禁用滑动的示例代码
myViewPager2.setUserInputEnabled(false);
启用在 viewpager2 中滑动的示例代码
myViewPager2.setUserInputEnabled(true);
【讨论】:
完美。现在我可以有一个地图片段并滚动它,然后对其他片段使用滑动。 这是否也禁止点击标签以将当前标签更改为另一个特定标签? 有没有办法使用 xml 做到这一点? @aLL 目前无法使用 XML 来做到这一点【参考方案3】:viewPager2.setUserInputEnabled(false);
【讨论】:
【参考方案4】:如果您使用的是 Android 数据绑定,您可以简单地在您的布局 xml 文件中禁用它。
app:userInputEnabled="@false"
【讨论】:
以上是关于如何禁用 ViewPager2 中的滑动?的主要内容,如果未能解决你的问题,请参考以下文章