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

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

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

Ответ 1

Простым решением является создание собственного подкласса 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;
    }
}

Затем в вашем файле Layout.XML замените теги <com.android.support.V4.ViewPager> тегами <com.yourpackage.CustomViewPager>.

Этот код был адаптирован из этого сообщения .

Ответ 2

Для этого есть простое решение:

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

mViewPager.setOnTouchListener(new OnTouchListener() {

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

И когда вы захотите повторно его активировать, выполните следующие действия:

mViewPager.setOnTouchListener(null);

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

Ответ 3

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

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().

Ответ 4

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

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

Ответ 5

Я предлагаю другой способ решить эту проблему. Идея заключается в том, чтобы обернуть ваш 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>

Не требуется код.

Прекрасно работает для меня.

Ответ 6

Чтобы отключить прокрутку

 mViewPager.beginFakeDrag();

Чтобы включить прокрутку

 mViewPager.endFakeDrag();

Ответ 7

Лучшее решение для меня:

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 для изменения страницы.

Ответ 8

Как насчет этого:
Я использовал 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);
       }
    }
}

Ответ 9

Здесь ответ в Kotlin и AndroidX

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class DeactivatedViewPager @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : ViewPager(context, attrs) {

    var isPagingEnabled = true

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(ev)
    }
}

Ответ 10

Ответ 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; 
        } 
    }

Итак, вы можете прокручивать бок о бок

Ответ 11

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

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

Подробнее см. этот ответ SO <

Ответ 12

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;

public class NonSwipeableViewPager extends ViewPager {

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

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

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // stop swipe 
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // stop switching pages
    return false;
}

private void setMyScroller() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        scroller.set(this, new MyScroller(getContext()));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public class MyScroller extends Scroller {
    public MyScroller(Context context) {
        super(context, new DecelerateInterpolator());
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int 
duration) {
        super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
    }
}
}

Затем в вашем файле Layout.XML замените любые теги --- com.android.support.V4.ViewPager --- на теги com.yourpackage.NonSwipeableViewPager ---.

Ответ 13

Новый класс ViewPager2 от androidx позволяет отключить прокрутку с помощью метода setUserInputEnabled (false)

private val pager: ViewPager2 by bindView(R.id.pager)

override fun onCreate(savedInstanceState: Bundle?) {
    pager.isUserInputEnabled = false
}