So deaktivieren oder aktivieren Sie das Wischen von Viewpager in Android


78

Was ich versuche zu tun: Ich versuche, das Wischen im Pager programmgesteuert zu aktivieren / deaktivieren, wenn das Programm ausgeführt wird

Beispiel: Wenn ich im Flowtruebin,wenn ich nach einer Bedingungsucheund wenn sie zurückgibt,aktivieren Sie das Wischen, und wenn die Bedingung zurückgibt,falsedeaktivieren Sie das Wischen.


Die Lösung, die ich benutze, ist diese

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

Wählen Sie dann diesen anstelle des in XML integrierten Viewpagers aus

<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" aufrufen, und Benutzer können nicht zum Paginieren wischen.


Problem mit der obigen Methodik: Ich kann die Eigenschaft nicht für den Flow festlegen, I: e .... Ich kann entweder das Wischen aktivieren oder das Wischen deaktivieren. Aber ich kann dies nicht basierend auf der Bedingung tun


Frage:

  1. Kann ich mein Ziel auf andere Weise erreichen, wenn ja, was ist es?
  2. Oder ist das nicht möglich?


Wäre es nicht möglich, die Eigenschaft mit DataBinding für den Flow festzulegen?
Älterer Gott

Antworten:


62

Deaktivieren Sie das Wischen progmatisch, indem Sie

    final View touchView = findViewById(R.id.Pager); 
    touchView.setOnTouchListener(new View.OnTouchListener() 
    {         
        @Override
        public boolean onTouch(View v, MotionEvent event)
        { 
           return true; 
        }
     });

und verwenden Sie dies, um manuell zu wischen

touchView.setCurrentItem(int index);

55
Dadurch kann der Viewpager immer noch teilweise gewischt werden (z. B. 1%), bevor er stoppt. Es sieht hässlich aus.
IgorGanapolsky

8
Seine Lösung funktioniert, sie ist nur unvollständig. Sie sollten auch onInterceptTouchEvent (MotionEvent-Ereignis) überschreiben. Dies gibt Ihnen den gewünschten Look ohne den 1%
Portfoliobuilder

2
Diese Methode kann nicht außer Kraft gesetzt werden
Animesh Mangla

es funktioniert, aber wenn es aktiviert ist, ist das Wischen sehr schlecht und langsam
faeze saghafi

5
Das ist eine absolut falsche Lösung, warum so viele Sterne. Es sieht in der Tat hässlich aus, mit einem Schlag von 1%. Wahrscheinlich sollten wir den Viewpager erweitern und auf InterceptTouchEvent
Anton Kizema am

74

Beste Lösung für mich. - Zuerst erstellen Sie eine Klasse wie folgt:

public class CustomViewPager extends ViewPager {
  private Boolean disable = false;
  public CustomViewPager(Context context) {
      super(context);
  }
  public CustomViewPager(Context context, AttributeSet attrs){
      super(context,attrs);
  }
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
     return !disable && super.onInterceptTouchEvent(event);
  }

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

  public void disableScroll(Boolean disable){
      //When disable = true not work the scroll and when disble = false work the scroll
      this.disable = disable;
  }
}

-Dann ändern Sie dies in Ihrem Layout: <android.support.v4.view.ViewPager dafür<com.mypackage.CustomViewPager

-Finally können Sie es deaktivieren: view_pager.disableScroll(true); oder aktivieren:view_pager.disableScroll(false);

Ich hoffe das hilft dir :)



1
Vergessen Sie auch nicht, die viewPager.invalidate () -Methode nach dem Aufruf der disable scrolling-Methode aufzurufen, da dadurch das Wischen sofort deaktiviert wird.
Ritesh Adulkar

Mit dieser Lösung erhalten die Ansichten in ViewPager keine Eingaben, wenn disable == true. Überschreiben onInterceptTouchEvent()ist nicht die richtige Lösung.
Alex Semeniuk

Anstelle von Boolean würde ich hier lieber Boolean verwenden.
Hgoebl

Vielen Dank. Ihre Antwort hat mir geholfen, eine funktionierende Funktion zu verbessern.
AndyN

19

Überschreiben Sie diese Methoden in Ihrem benutzerdefinierten Ansichts-Pager-Adapter in ViewPager.

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

Zum Aktivieren geben Sie einfach jede superMethode zurück:

super.onInterceptTouchEvent(event)und super.onTouchEvent(event).


4

Zum Deaktivieren des Wischens

mViewPager.beginFakeDrag();

Zum Aktivieren des Wischens

if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();



Können Sie Ihre Anfrage bearbeiten?
Sanjay Bhalani

Ich versuche, diese Lösung zu verwenden, aber beim Aufruf von endFakeDrag wird eine NullPointerException ausgelöst.
Mia

versuchen Sie eine Bedingung wie zu verwenden. if (mViewPager.isFakeDragging ()) mViewPager.endFakeDrag ();
Sanjay Bhalani

3

In meinem Fall hat die vereinfachte Lösung gut funktioniert. Die Überschreibungsmethode muss sich in Ihrem benutzerdefinierten Viewpager-Adapter befinden, um TouchEvent-Listener zu überschreiben und sie einzufrieren.

@Override
public boolean onTouchEvent(MotionEvent event) {
    return this.enabled && super.onTouchEvent(event);

}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return this.enabled && super.onInterceptTouchEvent(event);

}

Geben Sie eine Erklärung für die bereitgestellte Lösung
Anantha Raju C

1
@ AnnanthaRajuC zur Verfügung gestellt :)
Eric

Mit dieser Lösung erhalten die Ansichten in ViewPager keine Eingaben, wenn this.enabled == false. Überschreiben onInterceptTouchEvent()ist nicht die richtige Lösung.
Alex Semeniuk

2

Ich habe eine andere Lösung gefunden, die für mich funktioniert hat. Folgen Sie diesem Link

https://stackoverflow.com/a/42687397/4559365

Grundsätzlich wird die Methode canScrollHorizontallyzum Deaktivieren des Wischens mit dem Finger überschrieben. Wie auch setCurrentItemimmer funktioniert immer noch.


Die canScrollHorizontally()Methode hat im aktuellen Szenario keine Auswirkung. Es wird nicht einmal aufgerufen, wenn ein Wischen stattfindet.
Alex Semeniuk

1

Das hat bei mir funktioniert.

   ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // disable swipe
            if(!swipeEnabled) {
                if (viewPager.getAdapter().getCount()>1) {
                    viewPager.setCurrentItem(1);
                    viewPager.setCurrentItem(0);
                }
            }
        }
        public void onPageScrollStateChanged(int state) {}
        public void onPageSelected(int position) {}
    };
    viewPager.addOnPageChangeListener(onPageChangeListener);

0

Wenn Sie es erweitern möchten, nur weil Sie ein nicht wischbares Verhalten benötigen, müssen Sie es nicht tun. ViewPager2 bietet eine nette Eigenschaft namens:isUserInputEnabled

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.