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

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

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

Простым решением является создание собственного подclassа 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 замените tags тегами .

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

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

Если вы хотите отключить прокрутку 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-макет:

     

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

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

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

  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 для изменения страницы.

Как насчет этого :
Я использовал 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 void scrollTo(int x, int y) { if(enabled) { super.scrollTo(x, y); } } } 

Ответ 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; } } 

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

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

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

Подробнее в этом ответе SO

  • Как изменить страницу ViewPager?
  • Android ViewPager - просмотр предварительного просмотра страницы слева и справа
  • Может ли ViewPager отображать несколько просмотров на странице?
  • Бесконечная прокрутка Image ViewPager
  • Реализация круговой прокрутки в PagerAdapter
  • android.content.res.Resources $ NotFoundException: Не удается найти идентификатор ресурса # 0xffffffff
  • Interesting Posts

    использование для государственных машин

    Что такое целочисленное переполнение в R и как это может произойти?

    XPath: Как выбрать узел с некоторым атрибутом по индексу?

    Настроить чат-панель Windows 8

    Как я могу вывести org.w3c.dom.Element в строковый формат в java?

    Самый простой способ разобрать строку с разделителями-запятыми на какой-то объект, который я могу пропустить, чтобы получить доступ к отдельным значениям?

    На mac, g ++ (clang) не удается выполнить поиск / usr / local / include и / usr / local / lib по умолчанию

    Как скрыть все элементы, кроме одного с помощью jquery?

    Как отслеживать выделения памяти в C ++ (особенно new / delete)

    Выполнение bash TAB больше похоже на cmd.exe

    Windows 7: разрешения пользователя сохраняют сброс для внешнего жесткого диска

    Как заставить Chrome использовать поисковую систему google.com без https

    Управление несколькими выборами с помощью MVVM

    Цвет текста в ListView Android

    Обратный (проанализировать вывод) массива Array.toString (int )

    Давайте будем гением компьютера.