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

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

【问题讨论】:

    标签: android androidx 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}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-04
        • 2021-10-12
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        相关资源
        最近更新 更多