viewpager switch swiping how disable android android-viewpager

android - switch - ¿Es posible deshabilitar el desplazamiento en una ViewPager?



viewpager android disable touch (10)

Anular solo en TouchEvent y onInterceptTouchEvent no es suficiente en caso de que tenga ViewPager en sí mismo dentro de otro ViewPager.

Child ViewPager daría un toque horizontal a los eventos de desplazamiento horizontal de ViewPager principal, a menos que esté posicionado en su primera / última página.

Ver más en esta respuesta SO

Tengo una ViewPager que ViewPager una instancia de una View . Me gustaría deshabilitar momentáneamente el desplazamiento del visor y los botones secundarios mientras se devuelve un resultado de búsqueda a la vista. He llamado a viewPager.setEnabled(false) pero esto no lo deshabilita.

¿Alguien tiene alguna idea?


Aquí está mi variante ligera de la respuesta de 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); } }

Con mi código, puede desactivar la búsqueda con setEnable() .


Encontré una solución simple.

//disable swiping mViewPager.beginFakeDrag(); //enable swiping mViewPager.endFakeDrag();


Hay una solución fácil para este:

Cuando quiera deshabilitar el desplazamiento del visor, entonces:

mViewPager.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1) { return true; } });

Y cuando quieras volver a producirlo, entonces:

mViewPager.setOnTouchListener(null);

Eso hará el truco.


La mejor solución que funcionó para mí es:

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; } }

Después de esto, el desplazamiento se deshabilitará al tocar y luego aún puede usar el método setCurrentItem para cambiar de página.


La respuesta de slayton funciona bien. Si quieres dejar de deslizar como un mono, puedes anular un OnPageChangeListener con

@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; } }

Entonces solo puedes deslizar uno al lado del otro


Para deshabilitar deslizar

mViewPager.beginFakeDrag();

Para habilitar deslizar

mViewPager.endFakeDrag();


Qué tal esto :
Utilicé CustomViewPager
y luego, anula el método scrollTo
Revisé el movimiento al hacer muchos pequeños golpes, no se desplaza a otras páginas.

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 boolean scrollTo(int x, int y) { if(enabled) { super.scrollTo(x, y) } } }


Sugiero otra forma de resolver este problema. La idea es envolver su viewPager mediante un scrollView, de modo que cuando este scrollView no sea desplazable, su viewPager no sea también desplazable.

Aquí está mi diseño 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>

Sin código necesario.

Funciona bien para mí


Una solución simple es crear su propia subclase de ViewPager que tenga un indicador private boolean , isPagingEnabled . Luego, anule los métodos onTouchEvent y onInterceptTouchEvent . Si isPagingEnabled es igual a true, invoque el método super ; de lo contrario, 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; } }

Luego, en su archivo Layout.XML , reemplace cualquier etiqueta <com.android.support.V4.ViewPager> con etiquetas <com.yourpackage.CustomViewPager> .

Este código fue adaptado de esta publicación de blog .