Как отключить смахивание в ViewPager2?

Возможно ли включить-отключить смахивание в новом андроиде viewpager2 составная часть?

7 ответов

Решение

Теперь есть возможность включить-отключить смахивание viewpager2 с помощью Version 1.0.0-alpha02

использование implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha02'

Версия 1.0.0-alpha02

Новые возможности

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

Изменения API

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

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

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

SAMPLE CODE, чтобы отключить считывание в viewpager2

myViewPager2.setUserInputEnabled(false);

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

myViewPager2.setUserInputEnabled(true);

Если вы используете Android Data Binding, вы можете просто отключить его в XML-файле макета.

      app:userInputEnabled="@{false}"
viewPager2.setUserInputEnabled(false);

Под капотом 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.isUserInputEnabled = false

просто используйтеmyViewPager2.setUserInputEnabled(false); // in java myViewPager2.isUserInputEnabled = false // in kotlinотключить ручную прокрутку пользователем при пролистывании

Да, это возможно.

mViewPager2.setUserInputEnabled(false);//отключаем свайп

mViewPager2.setUserInputEnabled(true);//включает свайп

Мы можем отключать и включать на основе вкладок, как показано в приведенном ниже коде.

      ViewPager2 mViewPager2 = findViewById(R.id.view_pager);
        mViewPager2.setOffscreenPageLimit(adapter.getItemCount() - 1);
        mViewPager2.setAdapter(adapter); 


        TabLayout tabLayout  = findViewById(R.id.sliding_tabs);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //do stuff here
                if(tab.getPosition() == 0){
                    **//ToDisable**
                    mViewPager2.setUserInputEnabled(false);
                }else{
                    **//ToEnable**
                    mViewPager2.setUserInputEnabled(true);
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
Другие вопросы по тегам