2014-09-19 11 views
6

मैं एक ऐप विकसित कर रहा हूं जिसमें मेनू के रूप में ViewPager है। प्रत्येक fragment बच्चे विचारों का एक समूह जो ListView, ScrollView, LinearLayout, हो सकता है आदि ... इस fragments से एक एक सेटिंग्स बटन जो एक ScrollView और कुछ LinearLayout (बटन) के साथ एक सेटिंग पैनल (LinearLayout आवरण) टॉगल है और SeekBar बच्चों के रूप में। यह सेटिंग्स पैनल (जब बर्खास्त कर दिया) ऊपर या नीचे एनीमेशन एक स्लाइड के साथ एनिमेटेड है और जब यह दिखाई दे रहा है मैं ViewPager पेजिंग निष्क्रिय कर दें:ViewPager पेजिंग को अक्षम करने का सबसे अच्छा तरीका

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE) { 
     return true; 
    } 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE) { 
     return true; 
    } 
    return super.onInterceptTouchEvent(event); 
} 

public boolean isPagingEnabled() { 
    return pagingEnabled; 
} 

public void setPagingEnabled(boolean pagingEnabled) { 
    this.pagingEnabled = pagingEnabled; 
} 

लेकिन यह एक समस्या के साथ आया था, हर बार पैनल सब यह निर्भर है बच्चे विचारों OnTouchEvent प्राप्त नहीं होता है और यही कारण है कि मैं एक GestureDetector.SimpleOnGestureListener जोड़ा गया है:

protected class YScrollDetector extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     Log.i(C.TAG, "distanceX " + distanceX + " distanceY " + distanceY); 
     return Math.abs(distanceY) < Math.abs(distanceX); 
    } 
} 

और मेरे ViewPageronInterceptTouchEvent करने के लिए बदल:

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE && (mGestureDetector != null && mGestureDetector.onTouchEvent(event))) { 
     return true; 
    } 
    return super.onInterceptTouchEvent(event); 
} 

यह काम करता है, पैनल बटन उनके ऑनक्लिक, लिस्ट व्यू स्वाइप आदि प्राप्त करते हैं ... लेकिन यह इतना सही काम नहीं करता है क्योंकि Math.abs(distanceY) < Math.abs(distanceX) यह सटीक नहीं है। यदि मैं तेजी से ऊपर और नीचे या तिरछे स्वाइप करता हूं या यदि मैं नाबालिग स्वाइप के साथ एक बटन को छूता हूं तो onInterceptTouchEventtrue लौटाएगा क्योंकि mGestureDetector.onTouchEvent(event)true भी वापस आ जाएगा।

कुछ गूगल खोज के बाद मैं इस भर में आया था:

viewPager.requestDisallowInterceptTouchEvent(true); 

और मैं कुछ इस तरह की कोशिश की:

myListView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     viewPager.requestDisallowInterceptTouchEvent(true); 
     return false; 
    } 
}); 

और यह वास्तव में काम करता है, क्योंकि अच्छी तरह से ViewPager.onInterceptTouchEvent यह MotionEvent.ACTION_DOWN के साथ पहली बार कहा जाता है और उसके बाद myListView.setOnTouchListener यह कहा जाता है MotionEvent क्रियाओं (MOVE और UP) के ठीक बाद और अस्वीकार करता है और मैं तेजी से ऊपर, नीचे, किन तरीकों, आदि को स्वाइप कर सकता हूं। ViewPager पृष्ठ नहीं है लेकिन ListView एक आकर्षण की तरह स्वाइप करता है।

लेकिन एक समस्या अभी भी बनी हुई है, मुझे यह requestDisallowInterceptTouchEvent(true) सभी बच्चों के विचार onTouchEvent में जोड़ना है, और यह सुरुचिपूर्ण कोड नहीं है।

तो मेरा सवाल है, मैं सही रास्ते पर हूं? क्या इस श्रोता को सभी पैनल बाल दृश्यों में जोड़ने से बचने के लिए वैसे भी है (बेशक अगर मुझे इसे सबसे सामान्य तरीके से करना होगा)?

आपके समय के लिए धन्यवाद।

उत्तर

16

पेजिंग को अक्षम करना falseonInterceptTouchEvent और onTouchEvent दोनों से लौटने के समान सरल होना चाहिए। ViewPager के आसपास आपको अतिरिक्त इशारा पहचान की आवश्यकता नहीं है। बढ़ाएँ ViewPager इस तरह:

public class MyViewPager extends ViewPager { 
    private boolean pagingEnabled = true; 

    public MyViewPager(Context context) { 
     super(context); 
    } 

    public MyViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setPagingEnabled(boolean pagingEnabled) { 
     this.pagingEnabled = pagingEnabled; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     return pagingEnabled && super.onInterceptTouchEvent(event); 
    } 

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

} 

मैं अपने ऐप्स में से एक में एक ही कारण के लिए (एक अलग नाम के साथ) एक ही बात का उपयोग करें और यह निश्चित रूप से काम करता है।

+1

मैं इतना बेवकूफ हूँ, ज़ाहिर है कि मुझे झूठ बोलना होगा! अगर मैं सच हो जाता हूं तो मैं बच्चों से गति घटनाओं को चुरा रहा हूं और घटनाओं को टचएवेंट() के माध्यम से व्यू ग्रुप में भेजा नहीं जाएगा। धन्यवाद! – GuilhE

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