是否可以禁用ViewPager上的滚动

mAn*_*oid 132 android android-viewpager

我有一个ViewPager实例化a View.当搜索结果返回到视图时,我想暂时禁用viewpager和子按钮的滚动.我打电话viewPager.setEnabled(false)但这不会禁用它.

有人有任何想法吗?

sla*_*ton 349

一个简单的解决方案是创建自己的子类,ViewPager其中包含一个private boolean标志isPagingEnabled.然后覆盖onTouchEventonInterceptTouchEvent方法.如果isPagingEnabledequals为true,则调用该super方法return.

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean b) {
        this.isPagingEnabled = b;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的Layout.XML文件<com.android.support.V4.ViewPager>中用<com.yourpackage.CustomViewPager>标签替换任何标签.

此代码改编自此博客文章.

  • PS:在XML中,使用<yourpkgname.CustomViewPager ...而不是<com.android,support.v4.ViewPager ... (13认同)
  • greate解决方案,工作正常.如果你想像猴子一样停止滑动你可以用@Override覆盖OnPageChangeListener public void onPageScrollStateChanged(final int state){switch(state){case ViewPager.SCROLL_STATE_SETTLING:mPager.setPagingEnabled(false); 打破; case ViewPager.SCROLL_STATE_IDLE:mPager.setPagingEnabled(true); 打破; } // noop} (2认同)

Akh*_*ran 34

这个有一个简单的解决方法:

如果要禁用viewpager滚动,则:

mViewPager.setOnTouchListener(new OnTouchListener() {

   public boolean onTouch(View arg0, MotionEvent arg1) {
      return true;
   }
}); 
Run Code Online (Sandbox Code Playgroud)

当你想重新获得它时:

mViewPager.setOnTouchListener(null);
Run Code Online (Sandbox Code Playgroud)

那就行了.

  • 几乎,但不完全.触摸仍然会发生,因此您可以通过执行大量小扫描来移动页面. (43认同)

rek*_*ire 28

这是我对slayton答案的轻量级变体:

public class DeactivatableViewPager extends ViewPager {
    public DeactivatableViewPager(Context context) {
        super(context);
    }

    public DeactivatableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !isEnabled() || super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return isEnabled() && super.onInterceptTouchEvent(event);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用我的代码,您可以禁用分页setEnable().


小智 18

我找到了一个简单的解决方

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用.仍然可以做很多小的滑动. (15认同)

M. *_*mor 11

我建议另一种解决这个问题的方法.我们的想法是用scrollView包装你的viewPager,这样当这个scrollView不可滚动时,你的viewPager也是不可滚动的.

这是我的XML布局:

        <HorizontalScrollView
            android:id="@+id/horizontalScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />

        </HorizontalScrollView>
Run Code Online (Sandbox Code Playgroud)

无需代码.

对我来说很好.

  • 这是一个不错的技巧,尽管我不喜欢这种额外的观点:( (2认同)

小智 9

在我使用 ViewPager 2 alpha 2 的情况下,以下代码段有效

viewPager.isUserInputEnabled = false

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

请参阅此以了解viewpager2 1.0.0-alpha02 中的更多更改

最新版本 ViewPager 2 alpha 4 也进行了一些更改

方向和 isUserScrollable 属性不再是 SavedState 的一部分

有关viewpager2#1.0.0-alpha04 中的更多更改,请参阅此内容

  • ViewPager2 的正确且有效的答案 (2认同)

Isa*_*era 5

要禁用滑动

 mViewPager.beginFakeDrag();
Run Code Online (Sandbox Code Playgroud)

启用滑动

 mViewPager.endFakeDrag();
Run Code Online (Sandbox Code Playgroud)

  • 滚动仍然是可能的,只是不再流畅。基本上,这只是在不解决问题的情况下恶化了质量。 (2认同)