Ich habe ViewPager und darunter habe ich 10 Schaltflächen. Durch Klicken auf die Schaltfläche, z. B. Nr. 4, wechselt der Pager sofort zu Seite Nr. 4 von mPager.setCurrentItem(3);
. Ich möchte das Paging jedoch deaktivieren, indem ich mit dem Finger horizontal wische. Das Paging erfolgt also NUR durch Klicken auf die Schaltflächen. Wie kann ich das Wischen mit dem Finger deaktivieren?
android
android-viewpager
Theateist
quelle
quelle
Antworten:
Sie müssen eine Unterklasse bilden
ViewPager
.onTouchEvent
Es enthält viele gute Dinge, die Sie nicht ändern möchten, z. B. das Zulassen, dass untergeordnete Ansichten berührt werden.onInterceptTouchEvent
ist das, was du ändern willst. Wenn Sie sich den Code für ansehenViewPager
, sehen Sie den Kommentar:Hier ist eine Komplettlösung:
Fügen Sie diese Klasse zunächst Ihrem
src
Ordner hinzu:Stellen
ViewPager
Sie als Nächstes sicher, dass Sie diese Klasse anstelle der regulären Klasse verwenden , die Sie wahrscheinlich als angegeben habenandroid.support.v4.view.ViewPager
. In Ihrer Layoutdatei möchten Sie Folgendes angeben:Dieses spezielle Beispiel befindet sich in a
LinearLayout
und soll den gesamten Bildschirm einnehmen, weshalblayout_weight
1 undlayout_height
0 dp ist.Und
setMyScroller();
Methode ist für einen reibungslosen Übergangquelle
0dp
Größe /1
Gewicht anstelle vonmatch_parent
Höhe gewählt haben, um den Vollbildeffekt zu erzielen? Erzielen Sie dadurch Leistungsverbesserungen?executeKeyEvent()
. Dies ist die Methode, die dann aufgerufen wirdallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
Die allgemeinere Erweiterung von
ViewPager
wäre, eineSetPagingEnabled
Methode zu erstellen , mit der wir Paging im laufenden Betrieb aktivieren und deaktivieren können. Um das Wischen zu aktivieren / deaktivieren, überschreiben Sie einfach zwei Methoden:onTouchEvent
undonInterceptTouchEvent
. Beide geben "false" zurück, wenn das Paging deaktiviert wurde.Wählen Sie dann diesen anstelle des in XML integrierten Viewpagers aus
Sie müssen nur die
setPagingEnabled
Methode mit aufrufen ,false
und Benutzer können nicht zum Paginieren wischen.quelle
onTouchEvent
undonInterceptTouchEvent
Methoden mitreturn enabled && super.onTouchEvent(event);
Der einfachste Weg ist zu
setOnTouchListener
und zurücktrue
fürViewPager
.quelle
pager.setCurrentItem(pager.getCurrentItem());
vor der Rückkehr hinzufügentrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
in meinem Adapter habe, wird die Neuerstellung von Seiten erzwungen und möglicherweise auch andere Probleme gelöst.Es ist besser, es als stilbar zu deklarieren, damit Sie seine Eigenschaft von xml aus ändern können:
Und in Ihren Werten / attr.xml:
damit du es in deinem Layout xml verwenden kannst:
Natürlich können Sie immer noch eine get / set-Eigenschaft haben.
quelle
Überschreiben nur
onTouchEvent
undonInterceptTouchEvent
ist nicht ausreichend, wenn Sie ViewPager selbst in einem anderen ViewPager haben. Der untergeordnete ViewPager stiehlt dem übergeordneten ViewPager horizontale Scroll-Touch-Ereignisse, es sei denn, er befindet sich auf der ersten / letzten Seite.Damit dieses Setup ordnungsgemäß funktioniert, müssen Sie auch die
canScrollHorizontally
Methode überschreiben .Siehe
LockableViewPager
Implementierung unten.quelle
Jetzt müssen wir keine benutzerdefinierten erstellen
ViewPager
Ein neuer
ViewPager2
Name Ansicht in Android verfügbarViewPager2
unterstützt vertikales Paging zusätzlich zum herkömmlichen horizontalen Paging. Sie können das vertikale Paging für einViewPager2
Element aktivieren, indem Sie dessenandroid:orientation
Attribut festlegenDeaktivieren des Wischens während der
viewpager2
VerwendungSo aktivieren Sie das Wischen in "
viewpager2
Verwendung"Weitere Informationen finden Sie hier
AKTUALISIEREN
Bitte überprüfen Sie: Migrieren Sie von ViewPager zu ViewPager2
Ein vollständiges Beispiel finden Sie unter Verwendung von ViewPager2 in Android
quelle
viewpager2
mitRecyclerView.Adapter
Wenn Sie von ViewPager aus erweitern, müssen Sie auch überschreiben,
executeKeyEvent
wie zuvor von @araks angegebenWeil einige Geräte wie das Galaxy Tab 4 10 'diese Schaltflächen dort anzeigen, wo die meisten Geräte sie nie anzeigen:
quelle
Swipe deaktivieren
Swipe aktivieren
quelle
Ich musste das Wischen auf einer bestimmten Seite deaktivieren und ihr eine schöne Gummibandanimation geben. So geht's:
quelle
onPageSelected
wird ausgeführt. Sogar die nächste Seite wird wechseln. Dieser Code wird also nicht benötigt.Ich weiß, es ist mächtig spät, dies zu posten, aber hier ist ein kleiner Hack, um dein Ergebnis zu erzielen;)
Fügen Sie einfach eine Dummy-Ansicht unter Ihrem Viewpager hinzu:
Fügen Sie dann ein
OnClickListener
zu Ihrem hinzuRelativeLayout
.Werden Sie ein bisschen kreativ mit Layouts, deren Platzierungen und ihrem Verhalten und Sie werden lernen, einen Weg zu finden, um absolut alles zu tun, was Sie sich vorstellen :)
Viel Glück!
quelle
setClickable
vonsetOnClickListener
, wenn Sie dasonClick
Ereignis nicht behandeln müssen .Ich schrieb eine
CustomViewPager
mit einer Wischsteuerung:Wenn Sie setzen
canScroll
auftrue
, diesViewPager
kann mit dem Finger werden klauen,false
im Gegenteil.Ich benutze dies in meinem Projekt und es funktioniert bis jetzt großartig.
quelle
Ich habe diese Klasse mit Erfolg genutzt. Das Überschreiben des executeKeyEvent ist erforderlich, um das Wischen mit Pfeilen auf einigen Geräten oder die Barrierefreiheit zu vermeiden:
Und in der XML nennen Sie es so:
quelle
performClick()
Methode nicht überschrieben wird.In Kotlin meine Lösung, die obigen Antworten kombiniert.
quelle
onInterceptTouchEvent()
wird verhindert, dass untergeordnete Ansichten Eingaben erhalten. In den meisten Fällen ist dies nicht das beabsichtigte Verhalten.In Kotlin können wir dieses Problem lösen, indem wir ein benutzerdefiniertes Widget erstellen, das die ViewPager-Klasse erbt, und einen Flag-Wert zum Steuern des Swipe-Verhaltens hinzufügen.
NoSwipePager.kt
In XML
Deaktivieren Sie das Wischen programmgesteuert. Wenn das
kotlin-android-extensions
Plugin in build.gradle angewendet wird , kann das Wischen durch Schreiben des folgenden Codes deaktiviert werden.Andernfalls können wir das Wischen mit dem folgenden Code deaktivieren:
quelle
onInterceptTouchEvent()
wird verhindert, dass untergeordnete Ansichten Eingaben erhalten. In den meisten Fällen ist dies nicht das beabsichtigte Verhalten.super.onInterceptTouchEvent(event)
in diesen Ansichten keine Ergebnisse aufgerufen werden, werden keine Eingaben empfangen (dies ist der dokumentierte Zweck deronInterceptTouchEvent
Methode).onInterceptTouchEvent()
Methode verhindert, dass dieser (Inhalt) Eingaben empfängt.Versuchen Sie, true von onInterceptTouchEvent () und / oder onTouchEvent () zu überschreiben und zurückzugeben , wodurch Berührungsereignisse auf dem Pager verbraucht werden.
quelle
true
zu implizieren, dass das Berührungsereignis behandelt wurde?Eine weitere einfache Lösung zum Deaktivieren des Wischens auf einer bestimmten Seite (in diesem Beispiel Seite 2):
quelle
quelle
Wenn Sie eine Bildergalerie mit
ImageView
s und schreibenViewPager
, die Zoomen und Schwenken unterstützt, finden Sie eine einfache Lösung, die hier beschrieben wird: Implementieren einer zoombaren ImageView durch Erweitern des Standard-ViewPagers in Phimpme Android (und Github-Beispiel - PhotoView ). Diese Lösung funktioniert nichtViewPager
alleine.quelle
Wenn Sie ViewPager2 verwenden, müssen Sie nur Folgendes verwenden:
viewpager.setUserInputEnabled(false);
Aus den Dokumenten :
Vielen Dank an: https://stackoverflow.com/a/61685871/9026710
quelle
Wenn Sie dasselbe für Android in Xamarin implementieren möchten, finden Sie hier eine Übersetzung in C #
Ich habe das Attribut " ScrollEnabled " genannt. Weil iOS nur den gleichen Namen verwendet. Sie haben also auf beiden Plattformen die gleiche Benennung, was es Entwicklern einfacher macht.
In der XML-Datei:
quelle
Keiner der oben genannten Codes funktioniert reibungslos. Ich habe dies versucht
quelle
Hier ist meine Implementierung
: Wenn Sie die Swipe-Animation deaktivieren möchten, können Sie den swipeListener links und rechts verwenden und möchten weiterhin mit dem Finger scrollen, jedoch ohne Animation
1-Override-
Viewpager
MethodeonInterceptTouchEvent
undonTouchEvent
2- Erstellen Sie Ihre eigenen
GestureDetector
3- Erkennen Sie die Wischgeste und verwenden Sie die
setCurrentItem(item, false)
ViewPager
Wenn Sie den ViewPager einrichten, stellen Sie den swipeListener ein
quelle
Ich habe den Viewpager nur ein wenig angepasst und das Wischen einfach deaktiviert.
quelle
quelle