2013-02-08 27 views
6

Próbuję zabronić moim ViewPager przewijania między kartami. Mam następującą sytuację:Jak przechwytywać zdarzenia dotykowe z ViewPager.OnPageChangeListener

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

     } 

mam logi z onPageScrolled i onPageScrollStateChanged normalnie, ale nie mam logów z onInterceptTouchEvent i onTouch. Co ja robię źle?

Odpowiedz

12

ten sposób obsłużyć ten (mój całą klasę):

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

} 

Wartość logiczna paging daje możliwość, aby włączyć to z przerwami, jeśli jest to potrzebne. Jeśli nie potrzebujesz, po prostu return false. Jeśli nie robisz nic specjalnego w onTouch, nie musisz tego zmieniać.

+0

Tak, to może działać .. ale różnica polega na tym, że moja klasa implementuje ViewPager.OnPageChangeListener. Myślę, że to jest problem, ponieważ onPageScrollStateChanged, onPageScrolled i onPageSelected mogą używać touchEvent, więc wszystkie touchEvent przechwycone przez moją aplikację przechodzą na te metody. Jakie jest twoje zdanie na ten temat? –

+1

to proste, ale działające rozwiązanie, dzięki. – SalutonMondo

0

Twój konstruktor nie zostanie wywołany btw. Czy tworzysz pager widoku według kodu lub nadmuchujesz go przez xml? Musisz zdefiniować odpowiednie konstruktory.

+0

Tworzę moim zdaniem pagera napełniające przez XML. To jest wznowiona wersja myClass. Ale metody z OnPageChangeListener działają normalnie. –

+0

Ta klasa nawet się nie kompiluje. Chodzi mi o to, że konstruktor musi być zdefiniowany we właściwy sposób, w zależności od sposobu tworzenia własnego widoku niestandardowego. W każdym razie może to zależeć od hierarchii widoków, na przykład czy istnieje jakiś widok/grupa przeglądowa, która może wcześniej przechwycić zdarzenie dotykowe? – gwa

2

return true; w swojej onInterceptTouchEvent();

+0

To nie jest problem, ponieważ nie mogę nawet przechwycić dzienników z tej metody. –