2012-02-07 12 views
5

मैं अपने ऐप में ViewPager का उपयोग कर रहा हूं जिसमें एक पेजिनेटेड गैलरी को लागू करने के लिए छवियों का एक क्षैतिज लेआउट है।एंड्रॉइड - व्यूपेजर स्क्रॉलिंग रीसेट

जब मैं अकेले दृश्य का परीक्षण करता हूं, यानी किसी गतिविधि के मुख्य दृश्य के रूप में, यह ठीक काम करता है। हालांकि, जब मैं इसे किसी अन्य लेआउट के हिस्से के रूप में शामिल करता हूं, तो स्क्रॉलिंग (या फ्लिकिंग) अजीब हो जाती है। यदि एक स्वाइप के माध्यम से आधा रास्ते के आसपास अपनी मूल स्थिति में रीसेट करना प्रतीत होता है (वास्तव में एकमात्र चीजें हैं जो मुझे अब तक काम करने के लिए मिल गई हैं)।

कोई विचार क्या समस्या हो सकती है?

बस किसी भी प्रासंगिकता के मामले में, दृश्य एक्सएमएल से फुलाया जाता है और PagerAdapter विरासत में जोड़ा गया है।

उत्तर

9

हाँ, ViewPager और अन्य स्क्रॉलिंग आइटम डिफ़ॉल्ट रूप से एक साथ अच्छी तरह से नहीं खेलते हैं। जब मुझे ऐसी चीजें करना पड़ता है, तो मैं आम तौर पर स्क्रॉल कर सकते हैं कि बच्चों के बारे में कुछ पता करने के लिए ViewPager subclass। फिर मेरे onInterceptTouchEvent() में मैं जांचता हूं कि हिट रेक्ट उस बच्चे के भीतर है या नहीं स्पर्श टच इवेंट को रोकें ताकि बच्चे को इसमें एक झटका लगा। कुछ इस तरह:

/** 
* Override to not intercept touch events within our scroller if it exists. 
*/ 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if(scrollerId != 0) { 
     View scroller = findViewById(scrollerId); 
     if(scroller != null) { 
      Rect rect = new Rect(); 
      scroller.getHitRect(rect); 
      if(rect.contains((int)ev.getX(), (int)ev.getY())) { 
       return false; 
      } 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
} 

तो आप सभी की जरूरत निर्धारित करने के लिए कि scrollerId (एक सरल सार्वजनिक विधि काम करता है) एक तरीका है।

नोट एक और तरीका है अगर आप ViewPagerबच्चों के साथ एक ScrollViewके लिए खड़ी स्क्रॉल तत्वों का उपयोग कर रहे है, तो आप एक अलग दिशा में जाने के लिए की आवश्यकता होगी। ScrollView का उप-वर्ग है जो क्षैतिज स्क्रॉलिंग दिशाओं और क्षैतिज स्क्रॉलिंग के लिए बेल्स का पता लगाता है ताकि ViewPager इसे उठा सके।

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
    } 

    return super.onInterceptTouchEvent(ev); 
} 
+0

लगा कि यह करने के लिए MotionEvents करने के लिए नीचे ... है कि सामान को कभी नहीं समझा आएगा लेकिन शायद नमूना कोड में मदद मिलेगी मुझे वहाँ पाने ... मैं तो बस जा रहा हूँ अब इसे आज़माने –

+0

हाँ ... कि काम करता है। हालांकि, चूंकि मुझे अब यह समझना शुरू हो रहा है, मुझे लगता है कि मुझे जल्द ही एक और समस्या होगी क्योंकि मेरे पास व्यूपेजर के भीतर छवियां क्लिक करने योग्य हैं और उन्हें गतिविधियों को शुरू करने की आवश्यकता है। उस पर कोई सुझाव .... मुझे लगता है कि मुझे ACTION_MOVE को पकड़ना चाहिए और ACTION_DOWN को अपने दूसरे उदाहरण के समान होना चाहिए। –

+0

नहीं, यह किसी भी मुद्दे का अधिक नहीं होना चाहिए। 'ImageView' पर अपना' ऑनक्लिक लिस्टनर 'सेट करें और उन्हें क्लिक करने योग्य (या तो अपने एक्सएमएल लेआउट में या कोड में) सेट करना सुनिश्चित करें और आपको ठीक होना चाहिए। क्लिक एक्शन की घटनाओं की तुलना में क्लिक एक्शन थोड़ा अलग रास्ता है। –

संबंधित मुद्दे