2013-02-08 16 views
6

Sto tentando di impedire a ViewPager di scorrere tra le schede. Ho la seguente situazione:Come intercettare gli eventi di tocco da 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; 
      } 

     } 

Ho i log da onPageScrolled e onPageScrollStateChanged normalmente, ma non ho i log da onInterceptTouchEvent e onTouch. Che cosa sto facendo di sbagliato?

risposta

12

Questo è come gestire questo (la mia intera classe):

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

} 

Il booleano paging ti dà la possibilità di trasformare questo in funzione ea riposo, se ne avete bisogno. Se non ti serve, solo return false. Se non stai facendo nulla di speciale in onTouch, non hai bisogno di sovrascriverlo.

+0

Sì, questo potrebbe funzionare .. ma la differenza è che la mia classe implementa ViewPager.OnPageChangeListener. Penso che questo sia il problema perché onPageScrollStateChanged, onPageScrolled e onPageSelected potrebbero usare touchEvent, quindi tutti i touchEvent catturati dalla mia applicazione vanno a questi metodi. Qual è la tua opinione al riguardo? –

+1

questa è una soluzione semplice ma funzionante, grazie. – SalutonMondo

0

Il costruttore non viene chiamato btw. Stai creando il cercapersone per codice o gonfiandolo con xml? È necessario definire i costruttori corretti.

+0

Sto creando mio avviso cercapersone gonfiaggio da XML. Questa è una versione ripresa di myClass. Ma i metodi da OnPageChangeListener sono in esecuzione normalmente. –

+0

Quella classe non viene nemmeno compilata. Il mio punto è che il costruttore deve essere definito in modo appropriato in base al modo in cui si crea un'istanza della vista personalizzata. Ad ogni modo, potrebbe dipendere dalla gerarchia delle viste, ad esempio, c'è qualche vista/gruppo di vista che potrebbe intercettare l'evento touch in precedenza? – gwa

2

return true; nel vostro onInterceptTouchEvent();

+0

Questo non è un problema perché non riesco nemmeno a prendere i registri da questo metodo. –

Problemi correlati