2013-02-08 7 views
6

Ich versuche zu verhindern, dass mein ViewPager zwischen Registerkarten scrollt. Ich habe die folgende Situation:Wie Sie Berührungsereignisse von ViewPager.OnPageChangeListener abfangen können

 public class MyClass extends ViewPager implements ViewPager.OnPageChangeListener, OnTouchListener { 

      public MyClass() { 
       setOnTouchListener(this); 
      } 

@Override 
    public void onPageScrollStateChanged(int state) { 
     Log.d("Testing", TAG + " onPageScrollStateChanged"); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     Log.d("Testing", TAG + " onPageScrolled"); 
    } 

    @Override 
    public void onPageSelected(int position) { 
     Log.d("Testing", TAG + " onPageSelected"); 
    } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent event) { 
      Log.d("Testing", "intercept"); 
       return false; 
     } 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.d("Testing", "touch2"); 
        return false; 
      } 

     } 

Ich habe die Protokolle von onPageScrolled und onPageScrollStateChanged normal, aber ich habe keine Protokolle von onInterceptTouchEvent und OnTouch. Was mache ich falsch?

Antwort

12

ist, wie ich handhaben diese (meine ganze Klasse):

public class SelectiveViewPager extends ViewPager { 
private boolean paging = true; 

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

public SelectiveViewPager(Context context, AttributeSet attributeSet){ 
    super(context, attributeSet); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent e) { 
    if (paging) { 
     return super.onInterceptTouchEvent(e); 
    } 

    return false; 
} 

public void setPaging(boolean p){ paging = p; } 

} 

Die boolean paging haben Sie die Möglichkeit diese auf und auszuschalten, wenn Sie es brauchen. Wenn Sie nicht brauchen, nur return false. Wenn Sie nichts Besonderes in onTouch tun, müssen Sie es nicht überschreiben.

+0

Ja, das mag funktionieren .. aber der Unterschied ist, dass meine Klasse ViewPager.OnPageChangeListener implementiert. Ich denke, das ist das Problem, da onPageScrollStateChanged, onPageScrolled und onPageSelected möglicherweise touchEvent verwenden, so dass alle von meiner Anwendung erfassten touchEvent diese Methoden verwenden. Was denkst du darüber? –

+1

das ist eine einfache, aber funktionierende Lösung, danke. – SalutonMondo

0

Ihr Konstruktor wird nicht BTW aufgerufen. Erstellen Sie den Ansichtspager nach Code oder durch Aufblasen mit xml? Sie müssen die richtigen Konstruktoren definieren. Diese

+0

ich meine Ansicht Pager aufblähenden durch Erstellen von XML. Dies ist eine wiederaufgenommene Version von myClass. Die Methoden von OnPageChangeListener werden jedoch normal ausgeführt. –

+0

Diese Klasse kompiliert nicht einmal. Mein Punkt ist, dass Konstruktor in der richtigen Weise entsprechend der Art und Weise definiert werden muss, wie Sie Ihre benutzerdefinierte Ansicht instanziieren. Wie auch immer, es könnte von der Sichtenhierarchie abhängen, zum Beispiel, gibt es irgendeine Ansicht/Sichtgruppe, die das Berührungsereignis früher abfangen könnte? – gwa

2

return true; in Ihrem onInterceptTouchEvent();

+0

Das ist nicht das Problem, weil ich die Protokolle von dieser Methode nicht einmal abfangen kann. –

Verwandte Themen