2010-08-24 18 views
7

स्क्रॉल करने के लिए बहुत छोटा है, मैं एंड्रॉइड ऐप विकास के लिए काफी नया हूं, और मैं एंड्रॉइड के सरलऑनजेस्टर लिस्टनर और व्यूफ्लिपर का उपयोग करके स्वाइप जेश्चर के साथ खेल रहा हूं। व्यूफ्लिपर के 3 बच्चे हैं, और प्रत्येक स्क्रॉलव्यू है। गतिविधि लोड होने पर वे सभी गतिशील रूप से आबादी वाले होते हैं, और इसके बाद वे नहीं बदलते हैं। स्क्रॉलव्यू वह जगह है जहां SimpleOnGestureListeners संलग्न हैं।स्क्रॉलव्यू स्वाइप नहीं होता है जब यह

यहाँ लेआउट मैं उपयोग कर रहा हूँ है:
+ ViewFlipper
++ scrollview (x3, प्रत्येक पृष्ठ के लिए, के साथ निम्न :)
+++ LinearLayout (ऊर्ध्वाधर प्रत्येक)
++++ TextView
++++ TableLayout (गतिशील/TableRows डब्ल्यू आबादी वाले)
++++ देखें

मैं आम ट्यूटोरियल कोड आप कहीं भी ऑनलाइन प्राप्त कर सकते हैं के साथ onFling विधि बढ़ाया, और यह बहुत अच्छा काम करता है - जब छोड़कर स्क्रॉल व्यू में से एक में स्क्रॉल करने के लिए पर्याप्त सामग्री नहीं है एल।

मैंने प्रिंट-टू-लॉग जोड़ने के लिए SimpleOnGestureListener के तरीकों में से प्रत्येक पर ओवरराइडिंग और सुपर को कॉल करके पहचान को छूने के लिए समस्या को कम कर दिया है।

जब मैं स्क्रॉल करता हूं उस पृष्ठ पर स्वाइप करता हूं, तो मुझे ऑनलाइन पर "ऑनक्लिक" में "" भरने "से भरा कुछ मिलता है। एक पृष्ठ पर जो स्क्रॉल करने के लिए बहुत छोटा है, मुझे ShowPress पर" ऑनक्लिक "में मिलता है "" ऑन लोंगप्रेस "में, और यह केवल तभी है जब मैं सामग्री के भीतर बहुत छोटा स्क्रॉलव्यू के बच्चों को छू रहा हूं - अगर मैं कहीं और स्पर्श करता हूं तो मुझे कोई घटना नहीं मिलती है।

क्या गलत है, या स्वाइप जेश्चर का पता लगाने के विचार चाहे स्क्रॉलव्यू कितना बड़ा हो?

संपादित करें: मैंने यह निर्धारित किया है कि जब मैं एंड्रॉइड 2.2 एमुलेटर पर चलाता हूं, तो एंड्रॉइड 2.1u1 DroidX एमुलेटर के विपरीत, यह दूर चला जाता है। यह कई वातावरण में पुन: उत्पन्न होता है।


मेरे पास इस पर कुछ और जानकारी है; ऐसा लगता है कि ऑनरसेप्ट टचवेन्ट को प्रत्येक गति घटना के लिए नहीं कहा जाता है जब एक स्क्रूव्यू एक फ्लिपर (या वर्कस्पेस व्यू) के भीतर होता है।

विशेष रूप से, व्यवहार मैं जबकि एक अन्य दृश्य वर्ग को संशोधित करने के लिए यह बहुत ही इस मुद्दे को ठीक करने के लिए मिला है (यह नहीं फ्लिपर्स के लिए अद्वितीय है) था इस प्रकार है - ध्यान दें कि यह एंड्रॉयड 2.1 ही है:

scrollview हैं स्क्रॉल करने के लिए काफी लंबा है, ACTION_DOWN गति ईवेंट स्क्रॉलव्यू द्वारा पकड़ा जाता है, और प्रत्येक आगामी ACTION_MOVE ईवेंट फ़्लिपर के इंटरसेप्ट टचवेन्ट पर जाता है, जहां इसे रोक दिया जाता है और उचित तरीके से संभाला जाता है। एंड्रॉइड 2.2 में, यह व्यवहार स्क्रॉल की लंबाई के बावजूद होता है।

2.1 पर वापस scrollview काफी देर तक स्क्रॉल करने के लिए नहीं है, तो ACTION_DOWN गति घटना scrollview द्वारा पकड़ा नहीं है, लेकिन इसके बजाय वापस Flipper की onTouchEvent लिए आता है। उसी इशारे के बाद की ACTION_MOVE घटनाएं ऑनइंटरसेप्ट टचएवेंट फ़ंक्शन को छोड़ दें और सीधे टचएवेंट फ़ंक्शन पर जाएं!

जिस तरह से मैंने इसे हल किया था, वह ACTION_MOVE ईवेंट के लिए टचएवेंट में कार्यक्षमता लेना था और इसे अपनी विधि में दोबारा दोबारा बनाना था। इस तरह, मेरे पास टचवेन्ट कॉल ऑनइंटरसेप्ट टचइवेंट पर हो सकता है, उसके बाद उस कार्यक्षमता के बाद यदि यह पता चलता है कि घटना पहले से अनचाहे हो गई है।

case MotionEvent.ACTION_MOVE: 

       if (touchState == TOUCH_STATE_SCROLLING) { 
        handleScrollMove(ev); 
       } else { 
    //    Log.d("workspace","caught a move touch event but not scrolling"); 
        //NOTE: We will never hit this case in Android 2.2. This is to fix a 2.1 bug. 
        //We need to do the work of interceptTouchEvent here because we don't intercept the move 
        //on children who don't scroll. 

        Log.d("workspace","handling move from onTouch"); 

        if(onInterceptTouchEvent(ev) && touchState == TOUCH_STATE_SCROLLING){ 
         handleScrollMove(ev); 
        } 

       } 

       break; 

यह WorkspaceView.java से है (एंड्रॉयड के Workspace.java के संशोधन, गूगल कोड पर एंड्रो-विचारों परियोजना में पाया, और अब यहाँ: Horizontal "tab"ish scroll between views)। अगर हमें एक चाल घटना मिलती है, और हम स्क्रॉल कर रहे हैं (जो केवल तब होता है जब हमने जानबूझकर इसे रोकने के लिए चुना है - यानी, यह अवरोध समारोह में सेट है, इसलिए हम पहले से ही इंटरसेप्ट फ़ंक्शन पर हैं) हम प्रदर्शन करते हैं हम जिस कदम व्यवहार की इच्छा रखते हैं। अगर हमें यहां एक चाल कार्यक्रम प्राप्त होता है और हम स्क्रॉल नहीं कर रहे हैं, तो हम घटना को वापस इंटरसेप्ट के माध्यम से भेजते हैं, और फिर देखें कि क्या हम अब स्क्रॉल करने के लिए सेट हैं या नहीं। यदि ऐसा है, तो हम कार्रवाई करते हैं।

यह सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है!

उत्तर

7

मैं एक नया वर्ग है कि scrollview बढ़ाया बनाने के लिए आवश्यक है, और इस प्रयोग किया है:।

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return gestureDetector.onTouchEvent(event); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev){ 
    gestureDetector.onTouchEvent(ev); 
    super.dispatchTouchEvent(ev); 
    return true; 
} 

मैं पता नहीं क्यों, लेकिन अगर मैं dispatchTouchEvent में कुछ भी लेकिन सच लौटने के लिए प्रयास करते हैं, यह काम नहीं करता (तार्किक बात

return (gestureDetector.onTouchEvent(ev) || super.dispatchTouchEvent(ev)); 

अगर मैं ठीक से समझने के लिए हो गया होता), और करता है।

1

ScrollView एस के लिए अपने लेआउट xml में android:fillViewport="true" सेट करने का प्रयास करें। यही कारण है कि ScrollView बताता दृश्य उसमें शामिल है के रूप में बड़ा होने के लिए

+0

यह सभी बच्चों पर इस तरह सेट है। मैंने सीधे XML की प्रतिलिपि बनाई और चिपकाया http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+PlanetAndroidCom+(Planet+Android) और इसे एक बच्चे के दृश्य के रूप में आजमाया। कुछ झुकाव के बाद मैं उन्हें सभी को व्यूपोर्ट भरने में कामयाब रहा। लेकिन एक बार जब भी उन्होंने कॉलबैक पर कोई भाग्य नहीं किया। अब तक, कोई स्क्रॉलबार नहीं है। –

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