Можно ли отключить прокрутку на 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>
код не нужен.
отлично работает для меня.
лучшее решение, которое сработало для меня:
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, если он не расположен на его первой / последней странице.
более подробно см. это так ответ