如何在 ViewPager2 中禁用特定方向的滑动

Sha*_*ain 5 android kotlin android-viewpager2

我想禁用从右向左滑动ViewPager2。我的导航抽屉里基本上有一个带有 2 页的 viewpager2 元素。我希望我的第二页仅在我单击第一页中的某个元素时显示(从第一页从右向左滑动不应打开第二页),而当我在第二页时,viewpager2 滑动(向左滑动)向右滑动)应该像在 viewpager 中那样滑动。

我尝试扩展ViewPager2类并覆盖触摸事件,但不幸的ViewPager2是它是最终类,因此我无法扩展它。

其次,我尝试使用setUserInputEnabledfalse 方法,但这完全禁用了所有滑动(我只想禁用从右向左滑动)。如果我能找到一些在滑动之前检查当前页面并禁用滑动的侦听器,它可能会起作用。

     implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha05'
Run Code Online (Sandbox Code Playgroud)

设置 ViewPager2 的代码

      ViewPager2 pager = view.findViewById(R.id.pager);
      ArrayList<Fragment> abc = new ArrayList<>();
      abc.add(first);
      abc.add(second);
      navigationDrawerPager.setAdapter(new DrawerPagerAdapter(
                this, drawerFragmentList));
      pager.setAdapter(new FragmentStateAdapter(this), abc);
Run Code Online (Sandbox Code Playgroud)

Sha*_*ain 8

我找到了一个监听器,它可以在用户尝试滑动时进行监听,然后它会检查当前页面,如果它是第一页,则禁用用户输入,否则默认启用它。

这是代码片段

在 Java 中:

pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
    @Override
    public void onPageScrollStateChanged(int state) {
        super.onPageScrollStateChanged(state);

        if (state == SCROLL_STATE_DRAGGING && pager.getCurrentItem() == 0) {
            pager.setUserInputEnabled(false);
        } else {
            pager.setUserInputEnabled(true);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

在科特林:

viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
    override fun onPageScrollStateChanged(state: Int) {
        super.onPageScrollStateChanged(state)

        viewPager.isUserInputEnabled = !(state == SCROLL_STATE_DRAGGING && viewPager.currentItem == 0)
    }
})
Run Code Online (Sandbox Code Playgroud)

由于我的场景只有 2 页,检查页码对我有好处,但如果我们有超过 2 页并且我们需要禁用在一个特定方向的滑动,我们可以使用onPageScrolled(int position, float positionOffset, int positionOffsetPixels)监听器viewpager2并处理所需的场景根据的正或负的值positionpositionOffset

  • @UmarHussain 是的,它绝对流畅,完全没有抖动,实际上这个监听器会在用户真正打算滑动时监听,以便在实际滑动发生之前处理行为 (2认同)