Можно ли отключить прокрутку на ViewPager

у меня есть ViewPager, который инстанцирует View. Я хотел бы отключить прокрутку viewpager и дочерних кнопок на мгновение, пока результат поиска возвращается в представление. Я звоню viewPager.setEnabled(false) но это не отключает его.

У кого-нибудь есть идеи?

10 ответов


простым решением является создание собственного подкласса ViewPager что есть private boolean флаг isPagingEnabled. Затем переопределите onTouchEvent и onInterceptTouchEvent методы. Если isPagingEnabled равно true вызова super метод, в противном случае return.

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean b) {
        this.isPagingEnabled = b;
    }
}

затем в заменить <com.android.support.V4.ViewPager> теги <com.yourpackage.CustomViewPager> теги.

этот код был адаптирован от этого блоге.


для этого есть простое исправление:

Если вы хотите отключить прокрутку viewpager, то:

mViewPager.setOnTouchListener(new OnTouchListener() {

   public boolean onTouch(View arg0, MotionEvent arg1) {
      return true;
   }
}); 

и когда вы хотите перечитывать его, тогда:

mViewPager.setOnTouchListener(null);

это сделает трюк.


вот мой легкий вариант ответа Слейтона:

public class DeactivatableViewPager extends ViewPager {
    public DeactivatableViewPager(Context context) {
        super(context);
    }

    public DeactivatableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !isEnabled() || super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return isEnabled() && super.onInterceptTouchEvent(event);
    }
}

С моим кодом вы можете отключить подкачку с помощью setEnable().


Я нашел простое решение.

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

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

вот мой XML-макет:

        <HorizontalScrollView
            android:id="@+id/horizontalScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />

        </HorizontalScrollView>

код не нужен.

отлично работает для меня.


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

 mViewPager.beginFakeDrag();

чтобы включить swipe

 mViewPager.endFakeDrag();

лучшее решение, которое сработало для меня:

public class DeactivatedViewPager extends ViewPager {

    public DeactivatedViewPager (Context context) {
        super(context);
    }

    public DeactivatedViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }
}

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


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

public class CustomViewPager extends ViewPager {

    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    } 

    @Override
    public void scrollTo(int x, int y) {
       if(enabled) {
          super.scrollTo(x, y);
       }
    }
}

ответ slayton работает отлично. Если вы хотите прекратить считывание, как обезьяна, вы можете переопределить OnPageChangeListener с помощью

@Override public void onPageScrollStateChanged(final int state) { 
        switch (state) { 
            case ViewPager.SCROLL_STATE_SETTLING: 
                mPager.setPagingEnabled(false); 
                break; 
            case ViewPager.SCROLL_STATE_IDLE: 
                mPager.setPagingEnabled(true); 
                break; 
        } 
    }

таким образом, вы можете только салфетки бок о бок


переопределение только onTouchEvent и onInterceptTouchEvent недостаточно, если у вас есть ViewPager внутри другого ViewPager.

Дочерний ViewPager будет стальной горизонтальной прокрутки сенсорных событий из родительского ViewPager, если он не расположен на его первой / последней странице.

более подробно см. это так ответ