2012-04-21 11 views
12

मेरे पास गतिविधि के रूट-स्तर पर व्यूपर है।नेस्टिंग एंड्रॉइड व्यूपेजर, एक सूची दृश्य के अंदर स्वाइपिंग सूची इत्यादि क्षैतिज

पेजर के प्रत्येक पृष्ठ में एक सूचीफ्रेगमेंट (एक FragmentPagerAdapter द्वारा समर्थित) होता है।

कुछ सूची दृश्य वस्तुओं में उन वस्तुओं की सामग्री को स्वाइप करने के लिए अतिरिक्त रूप से ViewPagers शामिल होना चाहिए (ई। जी। सूची आइटम के अंदर एक क्षैतिज गैलरी)।

मैं पेजर्स को कैसे देख सकता हूं? ViewPager -> ListView (एक पृष्ठ में) -> ViewPager (एक सूची आइटम के अंदर)

मैं क्षैतिज सूची सूची के बीच स्वाइप कर सकता हूं और मैं पूरी सूची को लंबवत स्वाइप कर सकता हूं, लेकिन मैं सूची आइटम के अंदर स्वाइप नहीं कर सकता।

उत्तर

0

आप उन तत्वों को वास्तव में घोंसला नहीं कर सकते जिन्हें उन्हें नियंत्रित करने के लिए समान संकेतों की आवश्यकता होती है। चूंकि व्यू पेजर क्षैतिज गति को पहले ही कैप्चर कर रहा है, इसलिए आपके नेस्टेड तत्व इसे प्राप्त नहीं करेंगे। आप फोकस और इसी तरह के प्रबंधन के जरिए इसे पाने के लिए शायद बहुत सारे काम कर सकते हैं - लेकिन अंत में आपका ऐप उपयोगकर्ताओं के लिए भ्रमित हो जाएगा। घोंसले तत्वों के लिए यह वास्तव में बेहतर है जो एक ही बातचीत का उपयोग करेंगे ... इस मामले में दो दृश्य पेजर्स दोनों तरफ से गति के लिए देख रहे हैं।

3

हालांकि यह सबसे अच्छा सहभागिता डिज़ाइन नहीं है, यह dispatchTouchEvent (MotionEvent EV) रूट स्तर गतिविधि की विधि को अधिलेखित और mainPager और वर्तमान ListView पर requestDisallowInterceptTouchEvent (सही) का उपयोग करके इस लागू करने के लिए संभव है अन्य स्क्रॉलिंग को रोकने के लिए। इस उदाहरण को देखो:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 

    Fragment listFragment = getSupportFragmentManager().findFragmentByTag(
      "android:switcher:" + R.id.pager + ":" + (mainPager.getCurrentItem())); 
    mainPager.getChildAt(mainPager.getCurrentItem()); 
    if (listFragment == null) 
     return super.dispatchTouchEvent(ev); 
    ViewPager embeddedPager = (ViewPager) listFragment.getView().findViewById(R.id.videopager); 
    if (embeddedPager != null) { 
     int[] position = new int[2]; 
     embeddedPager.getLocationOnScreen(position); 
     if (ev.getY() > position[1] && ev.getY() < position[1] + embeddedPager.getHeight()) { 
      mainPager.requestDisallowInterceptTouchEvent(true); 
      if (embeddedPager.getScrollX() % embeddedPager.getWidth() != 0) { 
       ListView listView = (ListView) listFragment.getView().findViewById(
         android.R.id.list); 
       listView.requestDisallowInterceptTouchEvent(true); 
      } 
     } 
    } 

    return super.dispatchTouchEvent(ev); 
} 
+0

इस के लिए धन्यवाद- मैंने इस विचार को थोड़ा सा संशोधित करने के लिए आपको 'गतिविधि # प्रेषण टचवेन्ट (मोशनइवेंट)' फ़ंक्शन से कहीं और कोड डालने के लिए संशोधित किया है, लेकिन मैंने जो विचार इस्तेमाल किया वह मूल रूप से आपका था :) –

11

मैं आंतरिक ViewPager के लिए एक OnTouchListener कहा:

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(
       event.getAction() == MotionEvent.ACTION_DOWN && 
       v instanceof ViewGroup 
     ) { 
       ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
     } 
     return false; 
    } 
}; 

यह सिर्फ भीतरी ViewPager पर ACTION_DOWN स्पर्श घटनाओं का पता लगाता है और यह अवरोध डालने से बाहरी एक से बचाता है। क्योंकि यह झूठा लौटाता है, केवल ACTION_DOWN ईवेंट हिट होना चाहिए; अन्य सभी घटनाओं को नजरअंदाज कर दिया जाएगा। आप इस श्रोता को बाहरी ViewPager की स्क्रॉलिंग से "संरक्षित" करने के लिए हर तत्व में जोड़ सकते हैं, हालांकि स्पष्ट रूप से यदि आप उन तत्वों पर कोई अन्य स्पर्श व्यवहार चुनना चाहते हैं जिन्हें आपको टच श्रोता के अंदर से निपटने की आवश्यकता होगी और संभवतः एक बेहतर श्रोता लागू करें।

@ रोडजा को श्रेय जिन्होंने मुझे पहली जगह में विचार दिया।

+2

वाह। बहुत साफ धन्यवाद! – Rodja

+0

अब तक का सबसे आसान समाधान। – OcuS

+1

बस यह विश्वास नहीं कर सकता कि यह कितनी आसानी से काम करता है। बहुत धन्यवाद, एंड्रयू और रोडजा! –

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