如何禁用 ViewPager2 中的滑动?

Posted

技术标签:

【中文标题】如何禁用 ViewPager2 中的滑动?【英文标题】:How to disable swiping in ViewPager2? 【发布时间】:2019-07-25 12:08:42 【问题描述】:

是否可以在新的android viewpager2组件中启用-禁用滑动?

【问题讨论】:

【参考方案1】:

在幕后ViewPager2RecyclerView 一起使用来膨胀片段视图,但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

新功能

能够禁用用户输入(setUserInputEnabledisUserInputEnabled

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 中的滑动?的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager1嵌入ViewPager2,两者重叠,怎么禁止ViewPager1的滑动功能?

学习记录(ViewPager2效果实现View事件传递)

学习记录(ViewPager2效果实现View事件传递)

学习记录(ViewPager2效果实现View事件传递)

学习记录(ViewPager2效果实现View事件传递)

如何计算 ViewPager2 中发生的滑动