Подтвердить что ты не робот

Как отключить или включить прокрутку viewpager в android

Что я пытаюсь сделать: Я пытаюсь включить/отключить прокрутку пейджера программно, когда программа работает

Пример: Если в потоке, если я проверяю условие, и если он возвращает true enable swiping, и если условие возвращает 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;
} }

Затем выберите это вместо встроенного viewpager в XML

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

Вам просто нужно вызвать метод setPagingEnabled с "false", и пользователи не смогут прокручивать страницы.


Проблема с приведенной выше методологией: Я не могу установить свойство в потоке, I: e.... Я либо могу включить или отключить прокрутку. Но я не могу сделать это на основе условия


Вопрос:

  • Могу ли я достичь своей цели каким-то другим способом, если да, то что это?
  • Или это невозможно?
4b9b3361

Ответ 1

Отключить прокрутку прогматически -

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

Ответ 2

Лучшее решение для меня. Во-первых, вы создаете класс следующим образом:

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

Я надеюсь, что это поможет вам:)

Ответ 3

В вашем пользовательском адаптере пейджера просмотра переопределите эти методы в 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

Я нашел другое решение, которое работало для меня, следуя этой ссылке

fooobar.com/questions/56801/...

В основном он отменяет метод canScrollHorizontally, чтобы отключить прокрутку пальцем. Как бы то ни было setCurrentItem.

Ответ 5

В моем случае упрощенное решение работало нормально. Метод переопределения должен быть в вашем настраиваемом адаптере ViewPager для переопределения слушателей TouchEvent и make'em freeze;

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

}

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

}

Ответ 6

Это сработало для меня.

   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

Для отключения смахивания

mViewPager.beginFakeDrag();

Для включения смахивания

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