如何禁用ViewPager2中的滑动?

168

在新的Android viewpager2组件中,是否有可能启用或禁用滑动呢?

7个回答

356

现在,使用 Version 1.0.0-alpha02 ,可以实现启用/禁用 viewpager2 的滑动功能。

请使用 implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'

版本 1.0.0

新功能

  • 能够禁用用户输入 (setUserInputEnabled, isUserInputEnabled)

API 更改

  • ViewPager2 类 final

错误修复

  • FragmentStateAdapter 稳定性修复

禁用 viewpager2 中滑动的示例代码

myViewPager2.setUserInputEnabled(false);

启用ViewPager2中的滑动示例代码

myViewPager2.setUserInputEnabled(true);

2
太好了。现在我可以拥有一个地图片段并滚动它,同时使用滑动来切换其他片段。 - FrankKrumnow
2
这是否也禁用了点击选项卡以将当前选项卡更改为另一个特定选项卡的功能? - Andrei Mesh
2
有没有一种使用 XML 来实现这个的方法? - aLL
目前没有使用XML的方法可以做到这一点。 - AskNilesh

16
如果您正在使用Android Data Binding,您可以在布局的xml文件中简单地禁用它。
app:userInputEnabled="@{false}"

12
viewPager2.setUserInputEnabled(false);

6
在 Kotlin 中,只需使用 viewPager2.isUserInputEnabled = false 就可以禁用用户输入。

6
在幕后,ViewPager2RecyclerView一起工作来填充片段视图,但是RecyclerView被隐藏了,以使其更加易于使用。
 val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
 rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)

获取位置为0的子项,即 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),并小心不要阻止点击。

12
子类化不可能,因为viewPages2是final的。 - Guy
5
当我回答时,ViewPager2是开放的。 - Nikola Despotoski
2
抱歉,仅为此创建一个单独的类是不好的实践。Kotlin和VP2提供了这个简短的一行代码 pager.userInputEnabled = false - RFM

1

是的,这是可能的。

mViewPager2.setUserInputEnabled(false); //禁用滑动

mViewPager2.setUserInputEnabled(true); //启用滑动

我们可以根据选项卡来禁用和启用,如下所示的代码:

ViewPager2 mViewPager2 = findViewById(R.id.view_pager);
        mViewPager2.setOffscreenPageLimit(adapter.getItemCount() - 1);
        mViewPager2.setAdapter(adapter); 


        TabLayout tabLayout  = findViewById(R.id.sliding_tabs);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //do stuff here
                if(tab.getPosition() == 0){
                    **//ToDisable**
                    mViewPager2.setUserInputEnabled(false);
                }else{
                    **//ToEnable**
                    mViewPager2.setUserInputEnabled(true);
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

1
简单地使用以下代码来禁用用户手动滑动:myViewPager2.setUserInputEnabled(false); // 在Java中 myViewPager2.isUserInputEnabled = false; // 在Kotlin中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接