2013-02-08 72 views
6

से स्पर्श ईवेंट को कैसे रोकें मैं टैब के बीच स्क्रॉल करने से अपने व्यूपेजर को अस्वीकार करने का प्रयास कर रहा हूं। मैं निम्नलिखित स्थिति है: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 का उपयोग कर सकता है, इसलिए मेरे अनुप्रयोग द्वारा पकड़ा गया सभी टचवेन्ट इन विधियों पर जाता है। इसके बारे में आपकी क्या राय है? –

+1

यह एक साधारण लेकिन कामकाजी समाधान है, धन्यवाद। – SalutonMondo

0

आपके कन्स्ट्रक्टर को बीटीडब्ल्यू नहीं कहा जाता है। क्या आप कोड पेजर को कोड द्वारा बना रहे हैं या इसे एक्सएमएल द्वारा बढ़ा रहे हैं? आपको उचित रचनाकारों को परिभाषित करने की आवश्यकता है।

+0

मैं एक्सएमएल द्वारा मेरे विचार पेजर चढ़ा बना रहा हूं। यह myClass का एक पुन: प्रारंभ संस्करण है। लेकिन OnPageChangeListener के तरीके सामान्य रूप से चल रहे हैं। –

+0

वह कक्षा संकलित भी नहीं करती है। मेरा मुद्दा यह है कि कन्स्ट्रक्टर को आपके कस्टम व्यू को तुरंत चालू करने के तरीके के अनुसार उचित तरीके से परिभाषित किया जाना चाहिए। वैसे भी यह दृश्य पदानुक्रम पर निर्भर हो सकता है, उदाहरण के लिए, क्या कोई दृश्य/दृश्य समूह है जो पहले स्पर्श ईवेंट को रोक सकता है? – gwa

2

return true; में अपने onInterceptTouchEvent();

+0

यह समस्या नहीं है क्योंकि मैं इस विधि से लॉग भी नहीं पकड़ सकता। –