如何禁用或启用android中的viewpager滑动

时间:2015-04-04 02:54:34

标签: android android-viewpager

我要做的是什么:我正在尝试在程序运行时以编程方式启用/禁用分页器中的滑动

例如: 当我在流程上检查条件并且是否返回true启用滑动时,如果条件返回false禁用滑动。


Solution i am using is this one

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;
} }

然后选择此项而不是XML中的内置viewpager

<mypackage.CustomViewPager 
android:id="@+id/myViewPager" 
android:layout_height="match_parent" 
android:layout_width="match_parent" />

你只需要调用&#34; setPagingEnabled&#34;使用&#34; false&#34;的方法并且用户无法刷到分页。


上述方法的问题:我无法在流上设置属性,I:e ....我可以启用滑动或禁用滑动。但我不能根据条件

这样做

问题:

  1. 我可以通过某种其他方式实现我的目标,如果是的话,它是什么?
  2. 或者这不可能吗?

8 个答案:

答案 0 :(得分:54)

以编程方式停用 -

    final View touchView = findViewById(R.id.Pager); 
    touchView.setOnTouchListener(new View.OnTouchListener() 
    {         
        @Override
        public boolean onTouch(View v, MotionEvent event)
        { 
           return true; 
        }
     });

并使用此功能手动滑动

touchView.setCurrentItem(int index);

答案 1 :(得分:46)

最适合我的解决方案。 - 首先,你创建一个这样的类:

public class CustomViewPager extends ViewPager {
  private Boolean disable = false;
  public CustomViewPager(Context context) {
      super(context);
  }
  public CustomViewPager(Context context, AttributeSet attrs){
      super(context,attrs);
  }
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
      return disable ? false : super.onInterceptTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
      return disable ? false : super.onTouchEvent(event);
  }

  public void disableScroll(Boolean disable){
      //When disable = true not work the scroll and when disble = false work the scroll
      this.disable = disable;
  }
}

- 然后在布局中更改此内容:<android.support.v4.view.ViewPager 这个<com.mypackage.CustomViewPager

- 最后,您可以将其停用:view_pager.disableScroll(true); 或启用它:view_pager.disableScroll(false);

我希望这能帮到你:)。

答案 2 :(得分:18)

在自定义视图寻呼机适配器中,覆盖ViewPager中的这些方法。

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
}

要启用,只需返回每个super方法:

super.onInterceptTouchEvent(event)super.onTouchEvent(event)

答案 3 :(得分:3)

我找到了另一个适用于我的解决方案,请点击此链接

https://stackoverflow.com/a/42687397/4559365

它基本上覆盖方法canScrollHorizontally以禁用手指滑动。无论setCurrentItem如何仍然有效。

答案 4 :(得分:3)

简化解决方案,运行正常 这个覆盖方法必须在你的服装viewpager适配器中覆盖TouchEvent监听器并使其冻结;

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

}

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

}

答案 5 :(得分:2)

用于禁止刷卡

mViewPager.beginFakeDrag();

用于启用刷卡

if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();

答案 6 :(得分:1)

这对我有用。

   ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // disable swipe
            if(!swipeEnabled) {
                if (viewPager.getAdapter().getCount()>1) {
                    viewPager.setCurrentItem(1);
                    viewPager.setCurrentItem(0);
                }
            }
        }
        public void onPageScrollStateChanged(int state) {}
        public void onPageSelected(int position) {}
    };
    viewPager.addOnPageChangeListener(onPageChangeListener);

答案 7 :(得分:1)

如果仅由于需要不可滑动的行为而想要扩展它,则不需要这样做。 ViewPager2提供了一个不错的属性,名为:isUserInputEnabled