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?
Antworten
Zu viele Anzeigen?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
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.
Jetzt müssen wir keine benutzerdefinierten ViewPager
Eine neue ViewPager2
Name Ansicht in Android verfügbar
ViewPager2
unterstützt das vertikale Paging zusätzlich zum traditionellen horizontalen Paging. Sie können das vertikale Paging für eineViewPager2
Element durch Setzen seinerandroid: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
-
Bitte prüfen: Umstellung von ViewPager auf ViewPager2
-
Ein vollständiges Beispiel finden Sie hier Verwendung von ViewPager2 in Android
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);
}
}
- See previous answers
- Weitere Antworten anzeigen