如何在Android中禁用或启用ViewPager刷卡


78

我要执行的操作:我正在尝试在程序运行时以编程方式启用/禁用在寻呼机中滑动

例如:在流程中,如果我检查条件并返回,则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;
} }

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

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

您只需要使用“ false”调用“ setPagingEnabled”方法,用户将无法滑动以进行分页。


以上方法的问题:我无法在流上设置属性,即....我可以启用刷卡或禁用刷卡。但是我不能根据条件做到这一点


题:

  1. 我能以其他方式实现我的目标吗?
  2. 还是不可能?


是否可以使用DataBinding在流上设置属性?
oldgod

Answers:


62

通过以下方式禁用通过编程方式滑动:

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

55
这仍然使viewpager在停止之前被部分刷过(例如1%)。看起来很丑。
IgorGanapolsky

8
他的解决方案有效,只是不完整。您还应该重写onInterceptTouchEvent(MotionEvent event)。这会给你你没有1%的愿望外观
portfoliobuilder

2
无法覆盖该方法
Animesh Mangla 2015年

它可以正常工作,但是启用后刷卡非常糟糕且缓慢
faeze saghafi

5
这绝对是错误的解决方案,为什么有那么多星星。滑动1%确实看起来很丑。大概,我们应该扩展viewpager,并覆盖onInterceptTouchEvent
Anton Kizema

74

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

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

希望对您有所帮助:)


Thanx Alberto :)
Praveen Kumar Verma

1
同样不要忘了在调用禁用滚动方法之后调用viewPager.invalidate()方法,因为它会立即禁用滑动。
Ritesh Adulkar '18

使用此解决方案,ViewPager中的视图将不会收到任何输入disable == true。覆盖onInterceptTouchEvent()不是正确的解决方案。
Alex Semeniuk

而不是布尔值,我宁愿在这里使用布尔值。
hgoebl,

谢谢。您的回答帮助我改善了工作功能。
AndyN

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

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

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


4

用于禁用刷卡

mViewPager.beginFakeDrag();

启用刷卡

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



您能详细说明一下您的查询吗?
Sanjay Bhalani

我尝试使用此解决方案,但在调用endFakeDrag时会抛出NullPointerException。
Mia

尝试使用类似的条件。如果(mViewPager.isFakeDragging())mViewPager.endFakeDrag();
Sanjay Bhalani

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

}

提供有关提供的解决方案的说明
Anantha Raju C

1
@AnanthaRajuC提供了:)
埃里克(Eric)

使用此解决方案,ViewPager内部的视图将不会收到任何输入this.enabled == false。覆盖onInterceptTouchEvent()不是正确的解决方案。
Alex Semeniuk


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.