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 .