Как отключить свайп в ViewPager2?

Можно ли включить-отключить смахивание в новом компоненте Android viewpager2?

125
0
35 238
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Под капотом 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'

Version 1.0.0

Новые особенности

  • Возможность отключить пользовательский ввод (setUserInputEnabled, isUserInputEnabled)

Изменения API

  • ViewPager2 финал класса

Исправление ошибок

  • FragmentStateAdapter исправления стабильности

ОБРАЗЕЦ КОДА для отключения свайпа в viewpager2

myViewPager2.setUserInputEnabled(false);

ОБРАЗЕЦ КОДА для включения свайпа в viewpager2

myViewPager2.setUserInputEnabled(true);
viewPager2.setUserInputEnabled(false);

Если вы используете привязку данных Android, вы можете просто отключить ее в XML-файле макета.

app:userInputEnabled = "@{false}"

Другие вопросы по теме