Как отключить смахивание в определенном направлении в ViewPager2 - PullRequest
0 голосов
/ 18 июня 2019

Я хочу отключить пролистывание справа налево в ViewPager2. У меня в основном элемент viewpager2 с 2 страницами в моем навигационном ящике. Я хочу, чтобы моя вторая страница отображалась только при нажатии какого-либо элемента на моей первой странице (смахивание справа налево с первой страницы не должно открывать вторую страницу), а когда я на второй странице, смахивание viewpager2 (слева) проведите вправо), следует провести, как следует в viewpager.

Я пытался расширить класс ViewPager2 и переопределить события касания, но, к сожалению, ViewPager2 является окончательным классом, поэтому я не могу его расширить.

Во-вторых, я попытался использовать метод setUserInputEnabled для false, но это полностью отключило все свайпы (я просто хочу отключить свайп справа налево). Если бы я мог найти какого-нибудь слушателя, который проверяет текущую страницу перед тем, как пролистывать, и отключить ее, в противном случае, это бы сработало.

     implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha05'

Код для настройки ViewPager2

      ViewPager2 pager = view.findViewById(R.id.pager);
      ArrayList<Fragment> abc = new ArrayList<>();
      abc.add(first);
      abc.add(second);
      navigationDrawerPager.setAdapter(new DrawerPagerAdapter(
                this, drawerFragmentList));
      pager.setAdapter(new FragmentStateAdapter(this), abc);

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Я нашел слушателя, который может прослушивать, когда пользователь пытается провести пальцем, затем он проверит текущую страницу, если это первая страница, отключить пользовательский ввод, иначе включите его, как он был по умолчанию.

Вот фрагмент кода для этого: -

        pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageScrollStateChanged(int state) {
                super.onPageScrollStateChanged(state);
                if (state == SCROLL_STATE_DRAGGING && pager.getCurrentItem() == 0) {
                    pager.setUserInputEnabled(false);
                } else {
                    pager.setUserInputEnabled(true);
                }
            }
        });

Поскольку мой сценарий состоял только из 2 страниц, проверка номера страницы была бы полезной для меня, но в случае, если у нас более 2 страниц, и нам нужноотключив свайп в одном конкретном направлении, мы можем использовать onPageScrolled(int position, float positionOffset, int positionOffsetPixels) слушатель viewpager2 и обрабатывать желаемый сценарий в соответствии с положительными или отрицательными значениями position и positionOffset.

0 голосов
/ 18 июня 2019

Переопределить методы для смахивания, как MotionEvent.

0 голосов
/ 18 июня 2019

Расширение класса viewpager и переопределение функций onInterceptTouchEvent и onTouchEvent. Затем определите направление удара и верните false, если вы не хотите проводить.

Вы можете использовать этот вспомогательный метод для определения удара:

float downX;  // define class level variable in viewpager 
private boolean wasSwipeToLeftEvent(MotionEvent event){
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = event.getX();
            return false;

        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
            return event.getX() - downX > 0;

        default:
            return false;
    }
}

Тогда в вашем методе для сенсорных событий:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {


    return !this.wasSwipeToLeftEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return return !this.wasSwipeToLeftEvent(event);
}

Я изменил код из этого ответа, если вам нужно больше объяснений, смотрите это: https://stackoverflow.com/a/34111034/4428159

...