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

Dev*_*ath 76 android android-viewpager

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

例如:在流程上,如果我检查一个条件,如果它返回true启用滑动,如果条件返回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;
} }
Run Code Online (Sandbox Code Playgroud)

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

<mypackage.CustomViewPager 
android:id="@+id/myViewPager" 
android:layout_height="match_parent" 
android:layout_width="match_parent" />
Run Code Online (Sandbox Code Playgroud)

您只需要使用"false"调用"setPagingEnabled"方法,用户将无法滑动到分页.


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


题:

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

小智 59

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

- 然后在你的布局中更改它:<android.support.v4.view.ViewPager 为此<com.mypackage.CustomViewPager

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

我希望这对你有所帮助:)


Aje*_*eet 57

通过以下方式禁止滑动 -

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

并使用此功能手动滑动

touchView.setCurrentItem(int index);
Run Code Online (Sandbox Code Playgroud)

  • 这仍然允许viewpager在停止之前被部分刷过(例如1%).它看起来很难看. (45认同)
  • 他的解决方案有效,它只是不完整.您还应该重写onInterceptTouchEvent(MotionEvent事件).如果没有1%,这将给你你想要的外观 (8认同)
  • 这是绝对错误的解决方案,为什么这么多明星.它确实看起来很难看,刷了1%.可能我们应该扩展viewpager,并覆盖onInterceptTouchEvent (4认同)
  • 无法覆盖该方法 (2认同)

Flo*_*lin 19

在自定义视图寻呼机适配器中,覆盖这些方法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;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Ars*_*ood 6

如果您只是因为需要不可滑动行为而想要扩展它,则不需要这样做。ViewPager2 提供了一个很好的属性,称为:isUserInputEnabled


San*_*ani 5

用于禁用滑动

mViewPager.beginFakeDrag();
Run Code Online (Sandbox Code Playgroud)

用于启用滑动

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


Sah*_*sal 5

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

viewPager2.setUserInputEnabled(false);
Run Code Online (Sandbox Code Playgroud)

要在 viewpager2 中启用滑动功能,请使用

viewPager2.setUserInputEnabled(true);
Run Code Online (Sandbox Code Playgroud)