¿Cómo deshabilitar la paginación deslizando el dedo en ViewPager pero aún así poder deslizar el dedo mediante programación?

Resuelto theateist asked hace 54 años • 28 respuestas

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?

theateist avatar Jan 01 '70 08:01 theateist
Aceptado

Necesitas subclasificar ViewPager. onTouchEventtiene muchas cosas buenas que no deseas cambiar, como permitir que las vistas de los niños reciban toques. onInterceptTouchEventes 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 srccarpeta:

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 LinearLayouty está destinado a ocupar toda la pantalla, razón por la cual layout_weightes 1 y layout_height0dp.

Y setMyScroller();el método es para una transición suave.

louielouie avatar Mar 10 '2012 22:03 louielouie

La extensión más general ViewPagersería crear un SetPagingEnabledmétodo para que podamos habilitar y deshabilitar la paginación sobre la marcha. Para habilitar/deshabilitar el deslizamiento, simplemente anule dos métodos: onTouchEventy 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 setPagingEnabledmétodo con falsey los usuarios no podrán deslizar el dedo para paginar.

Rajul avatar Nov 18 '2012 06:11 Rajul

Ahora no necesitamos crear personalizados.ViewPager

Un nuevo ViewPager2 nombre Ver disponible en Android

Soporte de orientación vertical

  • ViewPager2admite paginación vertical además de la paginación horizontal tradicional. Puede habilitar la paginación vertical para un ViewPager2elemento configurando su android:orientationatributo

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 viewpager2uso

viewPager2.setUserInputEnabled(false);

Para habilitar el deslizamiento en viewpager2uso

viewPager2.setUserInputEnabled(true);

para más información revisa esto

  • VerPager2
  • ViewPager2 bajo el capó
  • Manos a la obra con ViewPager2

ACTUALIZAR

AskNilesh avatar Mar 19 '2019 15:03 AskNilesh