是否可以禁用ViewPager的滚动

我有一个ViewPager实例化一个View 。 我想暂时禁用viewpager和子button的滚动,同时search结果返回到视图。 我已经调用viewPager.setEnabled(false)但是这并没有禁用它。

任何人有任何想法?

一个简单的解决scheme是创build你自己的ViewPager的子类,它有一个private boolean标志isPagingEnabled 。 然后重写onTouchEventonInterceptTouchEvent方法。 如果isPagingEnabled等于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; } } 

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

这个代码是从这个博客文章改编的 。

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

当你想禁用viewpager滚动然后:

 mViewPager.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { return true; } }); 

而当你想重新调整它时:

 mViewPager.setOnTouchListener(null); 

这将有诀窍。

这是我的重量的变体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); } } 

用我的代码,你可以禁用setEnable()分页。

我find一个简单的解决scheme

 //disable swiping mViewPager.beginFakeDrag(); //enable swiping mViewPager.endFakeDrag(); 

我build议另一种方法来解决这个问题。 这个想法是由一个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> 

没有需要的代码。

为我工作得很好。

禁用滑动

  mViewPager.beginFakeDrag(); 

启用滑动

  mViewPager.endFakeDrag(); 

slayton的答案很好。 如果你想停止像猴子一样滑动,你可以用一个OnPageChangeListener重写

 @Override public void onPageScrollStateChanged(final int state) { switch (state) { case ViewPager.SCROLL_STATE_SETTLING: mPager.setPagingEnabled(false); break; case ViewPager.SCROLL_STATE_IDLE: mPager.setPagingEnabled(true); break; } } 

所以你只能并排滑动

这个怎么样 :
我使用CustomViewPager
接下来,重写scrollTo方法
我做了很多小动作的时候检查了一下,不滚动到其他页面。

 public class CustomViewPager extends ViewPager { private boolean enabled; public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.enabled = true; } @Override public boolean onTouchEvent(MotionEvent event) { if (this.enabled) { return super.onTouchEvent(event); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (this.enabled) { return super.onInterceptTouchEvent(event); } return false; } public void setPagingEnabled(boolean enabled) { this.enabled = enabled; } @Override public boolean scrollTo(int x, int y) { if(enabled) { super.scrollTo(x, y) } } } 

为我工作的最佳解决scheme是:

 public class DeactivatedViewPager extends ViewPager { public DeactivatedViewPager (Context context) { super(context); } public DeactivatedViewPager (Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean canScrollHorizontally(int direction) { return false; } } 

在这之后,滚动将被禁用,然后您仍然可以使用setCurrentItem方法更改页面。

如果您将ViewPager本身放在另一个ViewPager中,则仅覆盖onTouchEvent和onInterceptTouchEvent是不够的。

除非ViewPager位于第一页/最后一页上,否则ViewPager会从父ViewPager滚动水平滚动触摸事件。

在这个答案中看到更多