Можно ли отключить прокрутку на 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
}