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? 那么,如何禁用手指滑动?
#1楼
参考:https://stackoom.com/question/eUTR/如何通过在ViewPager中用手指轻扫来禁用分页-但是仍然能够以编程方式轻扫
#2楼
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;
}
});
#3楼
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
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
You just need to call the setPagingEnabled
method with false
and users won't be able to swipe to paginate. 您只需要使用false
调用setPagingEnabled
方法,用户将无法滑动以进行分页。
#4楼
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();
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return swipeable ? super.onInterceptTouchEvent(event) : false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return swipeable ? super.onTouchEvent(event) : false;
}
And in your values/attr.xml: 并在您的values / attr.xml中:
<declare-styleable name="MyViewPager">
<attr name="swipeable" format="boolean" />
</declare-styleable>
so that you can use it in you layout xml: 这样就可以在布局xml中使用它:
<mypackage.MyViewPager
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/viewPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:swipeable="false" />
Of course, you can still have a get/set property. 当然,您仍然可以拥有一个get / set属性。
#5楼
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);
}
}
#6楼
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;
}