Можно ли отключить прокрутку на ViewPager

У меня есть ViewPager который создает экземпляр представления. Я хотел бы временно отключить прокрутку кнопок просмотра и дочерних кнопок, в то время как результат поиска возвращается в представление. Я viewPager.setEnabled(false) но это не отключает его.

У кого-нибудь есть идеи?

Solutions Collecting From Web of "Можно ли отключить прокрутку на ViewPager"

Простым решением является создание собственного подкласса ViewPager с private boolean флагом isPagingEnabled . Затем переопределите методы onTouchEvent и onInterceptTouchEvent . Если isPagingEnabled равно true, вызовите метод super , иначе return .

 public class CustomViewPager extends ViewPager { private boolean isPagingEnabled = true; public CustomViewPager(Context context) { super(context); } public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { return this.isPagingEnabled && super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return this.isPagingEnabled && super.onInterceptTouchEvent(event); } public void setPagingEnabled(boolean b) { this.isPagingEnabled = b; } } 

Затем в файле Layout.XML замените теги <com.android.support.V4.ViewPager> тегами <com.yourpackage.CustomViewPager> .

Этот код был адаптирован из этого сообщения в блоге .

Для этого есть легкое решение:

Если вы хотите отключить прокрутку viewpager, выполните следующие действия:

 mViewPager.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { return true; } }); 

И когда вы захотите переустановить его, тогда:

 mViewPager.setOnTouchListener(null); 

Это сделает трюк.

Вот мой легкий вариант ответа Slayton:

 public class DeactivatableViewPager extends ViewPager { public DeactivatableViewPager(Context context) { super(context); } public DeactivatableViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { return !isEnabled() || super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return isEnabled() && super.onInterceptTouchEvent(event); } } 

С моим кодом вы можете отключить пейджинг с помощью setEnable() .

Я нашел простое решение.

 //disable swiping mViewPager.beginFakeDrag(); //enable swiping mViewPager.endFakeDrag(); 

Я предлагаю другой способ решить эту проблему. Идея заключается в том, чтобы обернуть ваш viewPager с помощью scrollView, так что, когда этот scrollView не прокручивается, ваш viewPager также не прокручивается.

Вот мой XML-макет:

  <HorizontalScrollView android:id="@+id/horizontalScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="wrap_content" android:layout_height="match_parent" /> </HorizontalScrollView> 

Не требуется код.

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

Ответ Slayton отлично работает. Если вы хотите остановить прокрутку, как обезьяну, вы можете переопределить OnPageChangeListener с помощью

 @Override public void onPageScrollStateChanged(final int state) { switch (state) { case ViewPager.SCROLL_STATE_SETTLING: mPager.setPagingEnabled(false); break; case ViewPager.SCROLL_STATE_IDLE: mPager.setPagingEnabled(true); break; } } 

Таким образом, вы можете прокручивать бок о бок

Как насчет этого :
Я использовал CustomViewPager
И затем, переопределить метод scrollTo
Я проверил движение, выполняя множество мелких щелчков, он не перескакивает на другие страницы.

 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; } @Override public boolean scrollTo(int x, int y) { if(enabled) { super.scrollTo(x, y) } } } 

Отключение салфетки

  mViewPager.beginFakeDrag(); 

Чтобы включить салфетки

  mViewPager.endFakeDrag(); 

Лучшее решение, которое сработало для меня:

 public class DeactivatedViewPager extends ViewPager { public DeactivatedViewPager (Context context) { super(context); } public DeactivatedViewPager (Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean canScrollHorizontally(int direction) { return false; } } 

После этого прокрутка будет отключена прикосновением, а затем вы можете использовать метод setCurrentItem для изменения страницы.

Переопределение только onTouchEvent и onInterceptTouchEvent недостаточно, если у вас есть сам ViewPager внутри другого ViewPager.

Child ViewPager будет ставить горизонтальные прокрутки событий касания от родительского ViewPager, если он не расположен на первой / последней странице.

См. Больше в этом SO ответ