Под капотом ViewPager2 работает с RecyclerView для увеличения просмотров фрагментов, но RecyclerView скрыт, поэтому они делают его более защищенным от идиотов.
val rv : RecyclerView = viewPager.getChildAt(0) as RecyclerView
rv.layoutManager = NonScrollingLayoutManager( rv.context, rv.layoutManager as LinearLayoutManager)
Хакерский способ - получить дочерний элемент в нулевой позиции, которая является RecyclerView, и отключить прокрутку в менеджере компоновки, обернув менеджер компоновки:
inner class NonScrollingLayoutManager(context: Context, val layoutManager: LinearLayoutManager) :
LinearLayoutManager(context, layoutManager.orientation, layoutManager.reverseLayout) {
override fun canScrollVertically(): Boolean = layoutManager.orientation == HORIZONTAL
override fun canScrollHorizontally(): Boolean = layoutManager.orientation == VERTICAL
}
Имейте в виду, что если API изменит диспетчер компоновки, используемый для RecyclerView, то есть они отойдут от LinearLayoutManager, это не сработает, и потребуется переопределить некоторые методы и обеспечить вызов суперметодов.
Второй подход — это подкласс ViewPager2, который является ViewGroup, а затем магия в перехвате событий касания, прежде чем они будут отправлены в дочерние представления (как вы могли бы догадаться, RecyclerView), и будьте осторожны, чтобы не предотвратить клики.
Теперь можно включить-выключить свайп viewpager2 с помощью Version 1.0.0-alpha02
Используйте implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'
Новые особенности
setUserInputEnabled, isUserInputEnabled)Изменения API
ViewPager2 финал классаИсправление ошибок
FragmentStateAdapter исправления стабильностиОБРАЗЕЦ КОДА для отключения свайпа в viewpager2
myViewPager2.setUserInputEnabled(false);
ОБРАЗЕЦ КОДА для включения свайпа в viewpager2
myViewPager2.setUserInputEnabled(true);
viewPager2.setUserInputEnabled(false);
Если вы используете привязку данных Android, вы можете просто отключить ее в XML-файле макета.
app:userInputEnabled = "@{false}"