2013-02-08 71 views
6

我試圖禁止我的ViewPager滾動選項卡之間。我有以下情況:如何攔截從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; 
      } 

     } 

我從onPageScrolled日誌和正常onPageScrollStateChanged,但我沒有從onInterceptTouchEvent和onTouch日誌。我究竟做錯了什麼?

回答

12

這是我如何處理這個(我的整個類):

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

} 

布爾paging使您能夠打開和關閉這一點,如果你需要它的選項。如果你不需要,只需return false。如果你在onTouch中沒有做任何特別的事情,你不需要重寫它。

+0

是的,這可能工作..但不同的是,我的類實現ViewPager.OnPageChangeListener。我認爲這是問題,因爲onPageScrollStateChanged,onPageScrolled和onPageSelected可能會使用touchEvent,所以我的應用程序捕獲的所有touchEvent都會轉到這些方法。你對此有何看法? –

+1

這是一個簡單但有效的解決方案,謝謝。 – SalutonMondo

0

你的構造函數不會被調用btw。您是通過代碼創建視圖傳呼機還是通過xml充氣?你需要定義正確的構造函數。

+0

我創建XML通過我的觀點尋呼機膨脹。這是myClass的恢復版本。但OnPageChangeListener中的方法正常運行。 –

+0

該類甚至沒有編譯。我的意思是,必須根據實例化自定義視圖的方式以適當的方式定義構造函數。無論如何,它可能取決於視圖層次結構,例如,是否有任何視圖/視圖組可以提前攔截觸摸事件? – gwa

2

return true;onInterceptTouchEvent();

+0

這不是問題,因爲我甚至無法從該方法中捕獲日誌。 –

相關問題