मैं एक ऐप विकसित कर रहा हूं जिसमें मेनू के रूप में 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);
}
}
और मेरे ViewPager
onInterceptTouchEvent
करने के लिए बदल:
@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)
यह सटीक नहीं है। यदि मैं तेजी से ऊपर और नीचे या तिरछे स्वाइप करता हूं या यदि मैं नाबालिग स्वाइप के साथ एक बटन को छूता हूं तो onInterceptTouchEvent
true
लौटाएगा क्योंकि 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
में जोड़ना है, और यह सुरुचिपूर्ण कोड नहीं है।
तो मेरा सवाल है, मैं सही रास्ते पर हूं? क्या इस श्रोता को सभी पैनल बाल दृश्यों में जोड़ने से बचने के लिए वैसे भी है (बेशक अगर मुझे इसे सबसे सामान्य तरीके से करना होगा)?
आपके समय के लिए धन्यवाद।
मैं इतना बेवकूफ हूँ, ज़ाहिर है कि मुझे झूठ बोलना होगा! अगर मैं सच हो जाता हूं तो मैं बच्चों से गति घटनाओं को चुरा रहा हूं और घटनाओं को टचएवेंट() के माध्यम से व्यू ग्रुप में भेजा नहीं जाएगा। धन्यवाद! – GuilhE