¿Cómo deshabilitar la paginación deslizando el dedo en ViewPager pero aún así poder deslizar el dedo mediante programación?
Tengo ViewPager y debajo tengo 10 botones. Al hacer clic en el botón, por ejemplo el número 4, el buscapersonas pasa inmediatamente a la página número 4 mPager.setCurrentItem(3);
. Pero quiero desactivar la paginación deslizando el dedo horizontalmente. Por lo tanto, la paginación se realiza SÓLO haciendo clic en los botones. Entonces, ¿cómo puedo desactivar el deslizamiento con el dedo?
Necesitas subclasificar ViewPager
. onTouchEvent
tiene muchas cosas buenas que no deseas cambiar, como permitir que las vistas de los niños reciban toques. onInterceptTouchEvent
es lo que quieres cambiar. Si miras el código de ViewPager
, verás el comentario:
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onMotionEvent will be called and we do the actual
* scrolling there.
*/
Aquí hay una solución completa:
Primero, agregue esta clase a su src
carpeta:
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);
setMyScroller();
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setMyScroller();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
//down one is added for smooth scrolling
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*/);
}
}
}
A continuación, asegúrese de utilizar esta clase en lugar de la normal ViewPager
, que probablemente especificó como android.support.v4.view.ViewPager
. En su archivo de diseño, querrá especificarlo con algo como:
<com.yourcompany.NonSwipeableViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
Este ejemplo en particular está en a LinearLayout
y está destinado a ocupar toda la pantalla, razón por la cual layout_weight
es 1 y layout_height
0dp.
Y setMyScroller();
el método es para una transición suave.
La extensión más general ViewPager
sería crear un SetPagingEnabled
método para que podamos habilitar y deshabilitar la paginación sobre la marcha. Para habilitar/deshabilitar el deslizamiento, simplemente anule dos métodos: onTouchEvent
y onInterceptTouchEvent
. Ambos devolverán "falso" si la paginación estaba deshabilitada.
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;
}
}
Luego seleccione esto en lugar del visor integrado en XML.
<mypackage.CustomViewPager
android:id="@+id/myViewPager"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Solo necesita llamar al setPagingEnabled
método con false
y los usuarios no podrán deslizar el dedo para paginar.
Ahora no necesitamos crear personalizados.ViewPager
Un nuevo ViewPager2
nombre Ver disponible en Android
Soporte de orientación vertical
ViewPager2
admite paginación vertical además de la paginación horizontal tradicional. Puede habilitar la paginación vertical para unViewPager2
elemento configurando suandroid:orientation
atributo
Usando XML
<androidx.viewpager2.widget.ViewPager2
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:orientation="vertical" />
Usando código
Para desactivar el deslizamiento en viewpager2
uso
viewPager2.setUserInputEnabled(false);
Para habilitar el deslizamiento en viewpager2
uso
viewPager2.setUserInputEnabled(true);
para más información revisa esto
- VerPager2
- ViewPager2 bajo el capó
- Manos a la obra con ViewPager2
ACTUALIZAR
Verifique: Migrar de ViewPager a ViewPager2
Para ver un ejemplo completo, consulte este Uso de ViewPager2 en Android