本文共 4033 字,大约阅读时间需要 13 分钟。
本文翻译自:
I have ViewPager and below it I have 10 buttons. 我有ViewPager,在它下面有10个按钮。 By clicking on button, for example #4, the pager goes immediately to page #4 by mPager.setCurrentItem(3);
通过单击按钮,例如#4,通过mPager.setCurrentItem(3);
,寻呼机立即转到第4页mPager.setCurrentItem(3);
. 。 But, I want to disable the paging by swiping with finger horizontally. 但是,我想通过水平滑动手指来禁用分页。 Thus, the paging is done ONLY by clicking on the buttons. 因此, 只能通过单击按钮来完成分页。 So, how I can disable the swiping with finger? 那么,如何禁用手指滑动?
参考:
The simplest way is to setOnTouchListener
and return true
for ViewPager
. 最简单的方法是setOnTouchListener
并为ViewPager
返回true
。
mPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
The more general extension of ViewPager
would be to create a SetPagingEnabled
method so that we can enable and disable paging on the fly. ViewPager
的更一般的扩展是创建SetPagingEnabled
方法,以便我们可以即时启用和禁用分页。 To enable / disable the swiping, just overide two methods: onTouchEvent
and onInterceptTouchEvent
. 要启用/禁用刷卡,只需覆盖两个方法: onTouchEvent
和onInterceptTouchEvent
。 Both will return "false" if the paging was disabled. 如果禁用分页,则两者都将返回“ false”。
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; } }
Then select this instead of the built-in viewpager in XML 然后选择它而不是XML中的内置viewpager
You just need to call the setPagingEnabled
method with false
and users won't be able to swipe to paginate. 您只需要使用false
调用setPagingEnabled
方法,用户将无法滑动以进行分页。
Better to declare it styleable, so you can change its property from xml: 最好声明它为可样式化,因此可以从xml更改其属性:
private boolean swipeable;public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager); try { swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true); } finally { a.recycle(); }}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) { return swipeable ? super.onInterceptTouchEvent(event) : false;}@Overridepublic boolean onTouchEvent(MotionEvent event) { return swipeable ? super.onTouchEvent(event) : false;}
And in your values/attr.xml: 并在您的values / attr.xml中:
so that you can use it in you layout xml: 这样就可以在布局xml中使用它:
Of course, you can still have a get/set property. 当然,您仍然可以拥有一个get / set属性。
I needed to disable swiping on one specific page, and give it a nice rubber-band animation, here's how: 我需要禁用在特定页面上的滑动,并给它一个漂亮的橡皮筋动画,方法如下:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == MANDATORY_PAGE_LOCATION && positionOffset > 0.5) { mViewPager.setCurrentItem(MANDATORY_PAGE_LOCATION, true); } }
Another easy solution to disable swiping at specific page (in this example, page 2): 禁用特定页面(在此示例中为第2页)上的滑动的另一种简单解决方案:
int PAGE = 2;viewPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (viewPager.getCurrentItem() == PAGE) { viewPager.setCurrentItem(PAGE-1, false); viewPager.setCurrentItem(PAGE, false); return true; } return false;}
转载地址:http://yscnb.baihongyu.com/