У меня есть ViewPager и под ним у меня есть 10 кнопок. При нажатии на кнопку, например № 4, пейджер сразу переходит на страницу № 4 mPager.setCurrentItem(3);
. Но я хочу отключить пейджинг, проводя пальцем по горизонтали. Таким образом, пейджинг осуществляется ТОЛЬКО нажатием на кнопки. Итак, как я могу отключить смахивание пальцем?
android
android-viewpager
theateist
источник
источник
Ответы:
Вы должны подкласс
ViewPager
.onTouchEvent
в нем есть много хороших вещей, которые вы не хотите менять, например, позволяете дочерним видам касаться друг друга.onInterceptTouchEvent
это то, что вы хотите изменить. Если вы посмотрите на код дляViewPager
, вы увидите комментарий:Вот полное решение:
Сначала добавьте этот класс в вашу
src
папку:Затем убедитесь, что вы используете этот класс вместо обычного
ViewPager
, который вы, вероятно, указали какandroid.support.v4.view.ViewPager
. В вашем файле макета вы захотите указать что-то вроде:Этот конкретный пример в
LinearLayout
и предназначен для всего экрана, поэтомуlayout_weight
1 иlayout_height
0dp.И
setMyScroller();
метод для плавного переходаисточник
0dp
роста /1
веса надmatch_parent
ростом, чтобы получить полноэкранный эффект? Вы получаете улучшения производительности, делая это?executeKeyEvent()
. Это метод, который затем вызыватьallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
Более общим расширением
ViewPager
было бы созданиеSetPagingEnabled
метода, чтобы мы могли включать и отключать пейджинг на лету. Чтобы включить / отключить смахивание, просто переопределите два метода:onTouchEvent
иonInterceptTouchEvent
. Обе вернутся «ложь», если подкачка была отключена.Затем выберите это вместо встроенного виджета в XML
Вам просто нужно вызвать
setPagingEnabled
метод с помощью,false
и пользователи не смогут пролистывать страницы.источник
onTouchEvent
иonInterceptTouchEvent
методы с помощьюreturn enabled && super.onTouchEvent(event);
Самый простой способ это
setOnTouchListener
и вернутьсяtrue
наViewPager
.источник
pager.setCurrentItem(pager.getCurrentItem());
перед возвратомtrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
в моем адаптере, который вызывает воссоздание страниц и, возможно, решение других проблем.Лучше объявить его стилизованным, так что вы можете изменить его свойство с xml:
И в ваших ценностях / attr.xml:
так что вы можете использовать его в вашем макете XML:
Конечно, у вас все еще может быть свойство get / set.
источник
Только переопределение
onTouchEvent
иonInterceptTouchEvent
не достаточно, если у вас есть сам ViewPager внутри другого ViewPager. Дочерний ViewPager украл бы события касания горизонтальной прокрутки из родительского ViewPager, если он не расположен на своей первой / последней странице.Для правильной работы этой настройки вам необходимо переопределить и
canScrollHorizontally
метод.Видеть
LockableViewPager
реализацию ниже.источник
Теперь нам не нужно создавать кастомы
ViewPager
Новое
ViewPager2
имя Посмотреть доступно в AndroidViewPager2
поддерживает вертикальный пейджинг в дополнение к традиционному горизонтальному пейджингу. Вы можете включить вертикальное разбиение на страницы дляViewPager2
элемента, установив егоandroid:orientation
атрибутЧтобы отключить смахивание в
viewpager2
использованииЧтобы включить смахивание в
viewpager2
Использоватьдля получения дополнительной информации проверьте это
ОБНОВИТЬ
Пожалуйста, проверьте: Миграция с ViewPager на ViewPager2
Для полного примера, пожалуйста, проверьте это Использование ViewPager2 в Android
источник
viewpager2
сRecyclerView.Adapter
Если вы выходите из ViewPager, вы также должны переопределить,
executeKeyEvent
как указано ранее @araksПотому что некоторые устройства, такие как Galaxy Tab 4 10 ', показывают эти кнопки там, где большинство устройств их не отображают:
источник
Чтобы отключить пролистывание
Чтобы включить пролистывание
источник
Мне нужно было отключить перелистывание на одной конкретной странице и дать ему хорошую анимацию с резинкой, вот как:
источник
onPageSelected
будет выполнен. Даже следующая страница будет переключаться. Итак, этот код не нужен.Я знаю, что это очень поздно, чтобы опубликовать это, но вот крошечный хак для достижения вашего результата;)
Просто добавьте фиктивный вид под вашим пейджером:
Затем добавьте
OnClickListener
к себеRelativeLayout
.Поэкспериментируйте с макетами, их размещением и поведением, и вы научитесь находить способ делать абсолютно все, что вы себе представляете :)
Удачи!
источник
setClickable
вместоsetOnClickListener
, если вам не нужно обрабатыватьonClick
событие.Я написал
CustomViewPager
с проведением управления:Если вы установите
canScroll
наtrue
этоViewPager
может быть ударяя палец,false
наоборот.Я использую это в своем проекте, и он прекрасно работает до сих пор.
источник
Я использовал этот класс с успехом. Переопределение executeKeyEvent требуется, чтобы избежать считывания с использованием стрелок на некоторых устройствах или для доступности:
И в XML это называется так:
источник
performClick()
метод не переопределен.В Kotlin моё решение, сочетающее приведенные выше ответы.
источник
onInterceptTouchEvent()
не позволит дочерним представлениям получать входные данные. В большинстве случаев это не предполагаемое поведение.В kotlin мы можем решить эту проблему, создав собственный виджет, наследующий класс ViewPager, и добавив значение флага для управления поведением свайпов.
NoSwipePager.kt
В XML
Отключить смахивание программно. Если
kotlin-android-extensions
плагин применяется в build.gradle , считывание можно отключить, написав код ниже.В противном случае мы можем отключить считывание с помощью кода ниже:
источник
onInterceptTouchEvent()
не позволит дочерним представлениям получать входные данные. В большинстве случаев это не предполагаемое поведение.super.onInterceptTouchEvent(event)
результаты в этих представлениях, не получая никакого ввода (что является задокументированной цельюonInterceptTouchEvent
метода).onInterceptTouchEvent()
метод не позволяет ему (контенту) получать входные данные.Попробуйте переопределить и вернуть true из onInterceptTouchEvent () и / или onTouchEvent () , которые будут использовать сенсорные события на пейджере.
источник
true
чтобы подразумевать, что событие касания было обработано?Еще одно простое решение - отключить перелистывание на определенной странице (в данном примере на странице 2):
источник
источник
Если вы напишите галерею изображений с символами
ImageView
s иViewPager
, поддерживающими масштабирование и панорамирование, см. Простое решение, описанное здесь: Реализация масштабируемого ImageView путем расширения стандартного ViewPager в Phimpme Android (и образца Github - PhotoView ). Это решение не работает вViewPager
одиночку.источник
Если вы используете ViewPager2, вам просто нужно использовать:
viewpager.setUserInputEnabled(false);
Из документов :
Спасибо: https://stackoverflow.com/a/61685871/9026710
источник
Если вы хотите реализовать то же самое для Android в Xamarin, вот перевод на C #
Я решил назвать атрибут « ScrollEnabled ». Потому что iOS просто использует одинаковые имена. Таким образом, у вас одинаковое наименование на обеих платформах, это облегчает разработчикам.
В файле .axml:
источник
Ни один из приведенного выше кода не работает гладко. Я попробовал это
источник
вот моя реализация
что если вы хотите отключить анимацию смахивания, вы можете использовать swipeListener влево и вправо и по-прежнему хотите прокрутить пальцем, но без анимации
1-переопределить
Viewpager
методonInterceptTouchEvent
иonTouchEvent
2- создай свой
GestureDetector
3- обнаружить жест смахивания и использовать
setCurrentItem(item, false)
ViewPager
когда вы настраиваете ViewPager установить swipeListener
источник
Я просто немного настроил видовой пейджер и легко отключил смахивание.
источник
источник