是否可以禁用ViewPager的滚动
我有一个ViewPager
实例化一个View
。 我想暂时禁用viewpager和子button的滚动,同时search结果返回到视图。 我已经调用viewPager.setEnabled(false)
但是这并没有禁用它。
任何人有任何想法?
一个简单的解决scheme是创build你自己的ViewPager
的子类,它有一个private boolean
标志isPagingEnabled
。 然后重写onTouchEvent
和onInterceptTouchEvent
方法。 如果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滚动水平滚动触摸事件。
在这个答案中看到更多