2012-11-06 32 views
5

मैं अपने आवेदन के "शीर्ष" View कैसे प्राप्त कर सकता हूं (जिसमें Activity और सभी DialogFragment एस हैं)? DialogFragment और मेरे Activity के बीच कुछ View की गति को संभालने के लिए मुझे सभी स्पर्श ईवेंट को अवरुद्ध करने की आवश्यकता है।सभी स्पर्श घटनाओं को कैसे रोकें?

मैं कोई भाग्य के साथ गतिविधि के Window की सजावट देखने के माध्यम से उन्हें (घटना) को पकड़ने के लिए की कोशिश की है:

getWindow().getDecorView().setOnTouchListener(...); 
+3

(..) विधि आप देखें से पहले सभी स्पर्श ईवेंट अवरोधन करने की अनुमति देता है: एस उन्हें देखकर । – Jens

+0

@ जेन्स यह सच है, लेकिन यह 'डायलॉगफ्रैगमेंट' पर स्पर्श को अवरुद्ध नहीं करता है (क्योंकि यह शायद किसी अन्य विंडो से संबंधित है) –

+0

मुझे लगता है कि आपने WindowManager # addView (..) का उपयोग करके अपनी सभी TYPE_SYSTEM_ALERT विंडो डालने का प्रयास किया है? – Jens

उत्तर

14

आप अपनी गतिविधि में सभी स्पर्श ईवेंट रोकना ओवरराइड कर सकते हैं, भले ही आप है स्क्रॉलव्यू, बटन इत्यादि जैसे कुछ दृश्य जो टच इवेंट का उपभोग करेंगे।

ViewGroup.requestDisallowInterceptTouchEvent के साथ संयोजन, आप व्यू ग्रुप की स्पर्श घटना को अक्षम कर सकते हैं। उदाहरण के लिए, यदि आप कुछ ViewGroup में सभी स्पर्श घटना को निष्क्रिय करना चाहते, इस कोशिश: गतिविधि # dispatchTouchEvent ओवरराइड

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    requestDisallowInterceptTouchEvent(
      (ViewGroup) findViewById(R.id.topLevelRelativeLayout), 
      true 
    ); 
    return super.dispatchTouchEvent(event); 
} 

private void requestDisallowInterceptTouchEvent(ViewGroup v, boolean disallowIntercept) { 
    v.requestDisallowInterceptTouchEvent(disallowIntercept); 
    int childCount = v.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     View child = v.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      requestDisallowInterceptTouchEvent((ViewGroup) child, disallowIntercept); 
     } 
    } 
} 
संबंधित मुद्दे