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?

14voto

Tayyab Mazhar Punkte 1172

Wenn Sie ViewPager2 verwenden, müssen Sie nur die Option:

viewpager.setUserInputEnabled(false);

Desde el docs :

Aktivieren oder deaktivieren Sie das vom Benutzer initiierte Blättern. Dazu gehören Berührungseingaben (Bildlauf- und Wischgesten) und Eingaben über die Tastatur. Die Deaktivierung der Tastatureingabe wird noch nicht unterstützt. Wenn der benutzerinitiierte Bildlauf deaktiviert ist, funktioniert der programmatische Bildlauf über setCurrentItem weiterhin. Standardmäßig ist der benutzerinitiierte Bildlauf aktiviert.

Dank an: https://stackoverflow.com/a/61685871/9026710

12voto

Jay Punkte 4691

Ich weiß, es ist sehr spät, um dies zu posten, aber hier ist ein kleiner Hack, um Ihr Ziel zu erreichen ;)

Fügen Sie einfach eine Dummy-Ansicht hinzu unter Ihren Viewpager:

<android.support.v4.view.ViewPager
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

<RelativeLayout
     android:id="@+id/dummyView"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</RelativeLayout>

Dann fügen Sie eine OnClickListener zu Ihrem RelativeLayout .

dummyView = (RelativeLayout) findViewById(R.id.dummyView);

dummyView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
         //Just leave this empty
    }
});

Werden Sie ein bisschen kreativ mit Layouts, ihrer Platzierung und ihrem Verhalten und Sie werden lernen, einen Weg zu finden, absolut alles zu tun, was Sie sich vorstellen :)

Viel Glück!

9voto

jaitor Punkte 99

In Kotlin

viewPagerNavigation.isUserInputEnabled = false

8voto

madx Punkte 6169

Ich habe diesen Kurs mit Erfolg genutzt. Das Überschreiben der executeKeyEvent ist erforderlich, um bei einigen Geräten das Wischen mit Pfeilen zu vermeiden oder die Barrierefreiheit zu gewährleisten:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;

public class ViewPagerNoSwipe extends ViewPager {
    /**
     * Is swipe enabled
     */
    private boolean enabled;

    public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = false; // By default swiping is disabled
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.enabled ? super.onTouchEvent(event) : false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.enabled ? super.onInterceptTouchEvent(event) : false;
    }

    @Override
    public boolean executeKeyEvent(KeyEvent event) {
        return this.enabled ? super.executeKeyEvent(event) : false;
    }

    public void setSwipeEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

Und in der xml nennen wir es so:

<package.path.ViewPagerNoSwipe
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

6voto

Sagar Chapagain Punkte 1608

In Kotlin können wir dies lösen, indem wir ein benutzerdefiniertes Widget erstellen, das von der ViewPager-Klasse erbt und einen Flag-Wert zur Steuerung des Swipe-Verhaltens hinzufügt.

NoSwipePager.kt

class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {

    var pagingEnabled: Boolean = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onTouchEvent(event)
        } else false
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onInterceptTouchEvent(event)
        } else false
    }
}

In xml

<your.package.NoSwipePager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/tab_layout" />

Wischen programmatisch deaktivieren. Wenn kotlin-android-extensions Plugin wird angewendet in build.gradle Die Funktion "Swiping" kann durch Eingabe des folgenden Codes deaktiviert werden.

view_pager.pagingEnabled = false

Andernfalls können wir das Durchstreichen mit dem folgenden Code deaktivieren:

val viewPager : ViewPager = findViewById(R.id.view_pager)
viewPager.pagingEnabled = false

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