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

How to disable or enable viewpager swiping in android

我正在尝试做的事情: 我正在尝试 Enable/disable 在程序 运行

时以编程方式在寻呼机中滑动

例如: 在流程中,如果我检查条件并且如果它 returns true启用滑动,如果条件 returns 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;
} }

然后 select 用这个代替 XML

中的内置 viewpager
<mypackage.CustomViewPager 
android:id="@+id/myViewPager" 
android:layout_height="match_parent" 
android:layout_width="match_parent" />

只需要用"false"调用"setPagingEnabled"方法,用户将无法滑动分页。


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

这样做

问题:

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

通过-

以编程方式禁用滑动
    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);

在您的自定义视图寻呼机适配器中,覆盖 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;
}

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

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

我找到了另一个对我有用的解决方案link

它基本上覆盖了 canScrollHorizontally 方法来禁用手指滑动。然而 setCurrentItem 仍然有效。

这对我有用。

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

对我来说最好的解决方案。 - 首先,你创建一个 class 这样的:

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 && super.onInterceptTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
     return !disable && 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);

希望对您有所帮助:)

就我而言,简化的解决方案效果很好。 覆盖方法必须在您的自定义 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);

}

用于禁用滑动

mViewPager.beginFakeDrag();

启用滑动

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

如果您只是因为需要 Not-Swipeable 行为而想要扩展它,则不需要这样做。 ViewPager2 提供了很好的 属性 调用:isUserInputEnabled

要在 viewpager2 中禁用滑动,请使用

viewPager2.setUserInputEnabled(false);

要在 viewpager2 中启用滑动使用

viewPager2.setUserInputEnabled(true);