614 Stimmen

Wie deaktivieren Sie Paging durch Streichen mit dem Finger in ViewPager aber immer noch in der Lage sein, programmgesteuert zu streichen?

Ich habe ViewPager und darunter habe ich 10 Schaltflächen. Wenn ich auf die Schaltfläche klicke, z.B. #4, geht der Pager sofort zur Seite #4, indem ich mPager.setCurrentItem(3); . Aber ich möchte das Blättern durch horizontales Wischen mit dem Finger deaktivieren. So wird das Blättern durchgeführt NUR indem Sie auf die Schaltflächen klicken. Wie kann ich also das Streichen mit dem Finger deaktivieren?

922voto

louielouie Punkte 14716

Sie müssen die Unterklasse ViewPager . onTouchEvent enthält viele gute Dinge, die Sie nicht ändern möchten, wie z. B. die Möglichkeit, dass Kinderansichten berührt werden können. onInterceptTouchEvent ist das, was Sie ändern wollen. Wenn Sie sich den Code für ViewPager sehen Sie den Kommentar:

    /*
     * 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.
     */

Hier ist eine vollständige Lösung:

Fügen Sie zunächst diese Klasse zu Ihrer src Ordner:

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*/);
        }
    }
}

Als Nächstes stellen Sie sicher, dass Sie diese Klasse anstelle der regulären ViewPager , die Sie wahrscheinlich als android.support.v4.view.ViewPager . In Ihrer Layoutdatei sollten Sie sie mit etwas wie " " angeben:

<com.yourcompany.NonSwipeableViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

Dieses besondere Beispiel befindet sich in einer LinearLayout und soll den gesamten Bildschirm einnehmen, weshalb layout_weight 1 ist und layout_height ist 0dp.

Und setMyScroller(); Methode ist für einen reibungslosen Übergang

488voto

Rajul Punkte 5866

Die allgemeinere Erweiterung von ViewPager wäre die Erstellung eines SetPagingEnabled Methode, so dass wir das Paging während der Laufzeit aktivieren und deaktivieren können. Zum Aktivieren / Deaktivieren der Swiping, einfach überschreiben zwei Methoden: onTouchEvent y onInterceptTouchEvent . Beide geben "false" zurück, wenn das Paging deaktiviert wurde.

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

Dann wählen Sie diesen anstelle des eingebauten Viewpagers in XML

<mypackage.CustomViewPager 
    android:id="@+id/myViewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" />

Sie müssen nur die setPagingEnabled Methode mit false und die Nutzer können nicht mehr zum Paginieren streichen.

151voto

AskNilesh Punkte 63763

Jetzt müssen wir keine benutzerdefinierten ViewPager

Eine neue ViewPager2 Name Ansicht in Android verfügbar

Unterstützung der vertikalen Ausrichtung

  • ViewPager2 unterstützt das vertikale Paging zusätzlich zum traditionellen horizontalen Paging. Sie können das vertikale Paging für eine ViewPager2 Element durch Setzen seiner android:orientation attribut

Verwendung von XML

<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:orientation="vertical" />

Code verwenden

So deaktivieren Sie das Wischen in viewpager2 verwenden.

viewPager2.setUserInputEnabled(false);

So aktivieren Sie das Einstreichen viewpager2 Verwenden Sie

viewPager2.setUserInputEnabled(true);

Weitere Informationen finden Sie hier

UPDATE

124voto

Wayne Punkte 6251

Der einfachste Weg ist setOnTouchListener und Rückkehr true für ViewPager .

mPager.setOnTouchListener(new OnTouchListener()
    {           
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            return true;
        }
    });

63voto

sidon Punkte 1384

Nur Vorrangstellung onTouchEvent y onInterceptTouchEvent ist nicht ausreichend, wenn Sie den ViewPager selbst innerhalb eines anderen ViewPagers haben. Der untergeordnete ViewPager würde die horizontalen Scroll-Touch-Ereignisse des übergeordneten ViewPagers stehlen, es sei denn, er ist auf seiner ersten/letzten Seite positioniert.

Damit dieses Setup richtig funktioniert, müssen Sie auch die canScrollHorizontally Methode.

Voir LockableViewPager Umsetzung unten.

public class LockableViewPager extends ViewPager {

    private boolean swipeLocked;

    public LockableViewPager(Context context) {
        super(context);
    }

    public LockableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean getSwipeLocked() {
        return swipeLocked;
    }

    public void setSwipeLocked(boolean swipeLocked) {
        this.swipeLocked = swipeLocked;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !swipeLocked && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return !swipeLocked && super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return !swipeLocked && super.canScrollHorizontally(direction);
    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X