एंड्रॉइड पर अपने माता-पिता के लिए किसी दृश्य के ऑनक्लिक इवेंट को कैसे पास करें?


100

मेरे पास एक लेआउट में एक TextView है जो पृष्ठभूमि का चयनकर्ता है। और TextView का टेक्स्ट HTML से Spanned पर सेट है। फिर मैंने LinkMovementMethod के साथ TextView सेट किया।

अब जब मैं TextView पर टैप करता हूं, तो चयनकर्ता को ट्रिगर करने के लिए क्लिक इवेंट को उसके मूल लेआउट पर नहीं भेजा जाता है।

इसे कैसे हल किया जाना चाहिए?

जवाबों:


45

मुझे लगता है कि आपको उन घटकों में से किसी एक का उपयोग करने की आवश्यकता है ताकि वह उचित घटकों को भेजे जाने से पहले घटना को रोक सके।

Activity.dispatchTouchEvent(MotionEvent) - इससे आपकी गतिविधि को विंडो में भेजे जाने से पहले सभी स्पर्श घटनाओं को अवरोधन करने की अनुमति मिलती है।

ViewGroup.onInterceptTouchEvent(MotionEvent) - यह एक व्यूग्रुप को घटनाओं को देखने की अनुमति देता है क्योंकि वे बाल दृश्य में भेजे जाते हैं।

ViewParent.requestDisallowInterceptTouchEvent(boolean) - एक अभिभावक को यह दिखाने के लिए कॉल करें कि यह स्पर्श घटनाओं को onInceptceptTouchEvent (MotionEvent) के साथ बाधित न करे।

अधिक जानकारी यहाँ

उम्मीद है की वो मदद करदे।


1
क्या माता-पिता के दृश्य में onClick और onLong पर क्लिक करने के लिए घटनाओं को पारित करने का एक आसान तरीका है, या मुझे उन्हें स्वयं लागू करना होगा?
शियाओमी

इसे बाहर की जाँच करें: stackoverflow.com/questions/2136696/pass-event-to-parent-view संभवतः आप उसी क्लिक श्रोता को अन्य उदाहरणों में पास करने की कोशिश करना चाह सकते हैं, भले ही मुझे पता नहीं है कि यह काम करेगा या नहीं , लेकिन एक कोशिश के काबिल हो सकता है।
लुइस मिगुएल सेरानो

नीचे उत्तर बहुत साफ है
जेपीएम

मैं MotionEvent तुरंत करना चाहिए? कृपया, समझाएं, @LuisMiguelSerrano
olegario

@olegario, आमतौर पर आप प्रेषण के लिए विधि को फिर से परिभाषित करते हैं। इसके लिए एक नए व्यवहार को परिभाषित करने के लिए, @Override के साथ, इस तरह से, ताकि आपको बस एक मोशन ईवेंट प्राप्त हो जिसे सिस्टम ने आपकी गतिविधि को प्रदान किया है (या आपके एप्लिकेशन का एक और घटक, और आप इसे अपने नियमों के अनुसार किसी भी संख्या में बच्चों के घटकों के लिए और / या अग्रेषित करें। कुछ इस तरह: @Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
लुइस मिगुएल सेरानो

212

अपने घोषित TextViewउपयोग करके नहीं क्लिक करने योग्य / फ़ोकस करने योग्य android:clickable="false"और android:focusable="false"या v.setClickable(false)और v.setFocusable(false)। क्लिक की घटनाओं को TextViewअब माता-पिता के पास भेज दिया जाना चाहिए ।

ध्यान दें:

इसे हासिल करने के लिए , आपको इसके डायरेक्ट पर क्लिक करना होगा parent। या सेट android:clickable="false"और android:focusable="false"उसके प्रत्यक्ष माता-पिता को आगे के माता-पिता को सुनने के लिए पारित करने के लिए


1
अरे यार अगर मैं ये +100 दे पाता तो मैं होता। यह देखने की कोशिश कर रहा था कि कैसे व्यूपोर्ट में केवल एक क्लिक पर काम किया जाए और टचआमज व्यू के साथ एडेप्टर लेआउट में ऑनटॉक लागू नहीं किया जाए! इस समाधान ने एक आकर्षण की तरह काम किया।
JPM

1
लेकिन क्या होगा अगर मैं EditText की फोकस परिवर्तन घटना को संभालना चाहता हूं?
स्वीटविशर

2
परिदृश्य यह है: मेरे पास एक लेआउट है जिसमें edittext, रिश्तेदार लेआउट, स्पिनर और सूची दृश्य शामिल हैं। जब भी मैं एडिटटेक्स्ट और स्पिनर की पटकथा पर कहीं भी टच करता हूं, पैरेंट लेआउट की टच ईवेंट को फायर करना चाहता हूं
SweetWisher ish

9
मन में धारण करने के लिए कुछ महत्वपूर्ण है कि यदि आप इसका उपयोग TextView#setOnClickListener()करते हैं TextView, तो यह क्लिक करने योग्य हो जाता है, भले ही इसे घोषित किया गया हो android:clickable="false", और भले ही इसे ( ) पर ClickListenerसेट किया जाएnullsetOnclickListener(null)
क्रिश्चियन गार्सिया

3
मजेदार तथ्य: यदि टेक्स्टव्यू में एक android:inputTypeविशेषता है तो यह क्लिक करने योग्य घटनाओं को भी क्लिक करने योग्य के साथ चुपचाप उपभोग करेगा: गलत और ध्यान देने योग्य: गलत; मेरे मामले में यह एक शैली में सेट किया गया था और इसका कारण जानने के लिए मुझे 30 मिनट का समय लगा।
किरिल कर्माज़िन

18

शायद ही कभी यह मदद करता है:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });

एक और प्रकार, हमेशा काम नहीं करता है:

child.setOnClickListener(null);

इस CardViewबच्चे के दृश्य के रूप में काम किया , क्योंकि CardViewलगता है कि उपेक्षा clickable="false"और focusable="false"। हालाँकि, इसके बजाय माता-पिता का उपयोग करना setOnTouchListenerऔर कॉल onTouchEventकरना माता-पिता को स्पर्श प्रतिक्रिया (जैसे तरंग प्रभाव) प्रदर्शित करने की अनुमति देता है।
मेग्निग्नेचर

मैंने नीचे प्रासंगिक कोड पोस्ट किया है: stackoverflow.com/a/52928884/5652513
मेसिजिनिटी

10

डाल

android:duplicateParentState="true"

बच्चे में तब विचारों को अपनी प्रत्यक्ष माता-पिता के बजाय अपने आप से अपनी आकर्षित करने योग्य स्थिति (ध्यान केंद्रित, आदि) प्राप्त होती है। आप माता-पिता के लिए ऑनक्लिक सेट कर सकते हैं और यह क्लिक किए गए बच्चे पर कॉल कर सकता है


ओपी माता-पिता की क्लिक श्रोता को कॉल करना चाहता है जब बच्चे को क्लिक किया जाता है, न कि बुद्धिमान वर्सा।
फरीद

3

यदि आपकी TextViewक्लिक समस्याएं पैदा करती हैं, तो android:inputType=""अपनी xml फ़ाइल से निकालें ।


यदि आप नहीं जानते कि क्यों, मैं आपको ऐसा नहीं करने की सलाह देता हूं। बस कह रही है ... प्रत्येक अपने स्वयं के लिए।
dell116

आपको इसेandroid:inputType="none"
AZ_

1

यह उत्तर अलेक्जेंडर उखोव के जवाब के समान है , सिवाय इसके कि यह क्लिक घटनाओं के बजाय स्पर्श घटनाओं का उपयोग करता है। उन घटनाओं से माता-पिता को उचित दबाए गए राज्यों (जैसे, लहर प्रभाव) को प्रदर्शित करने की अनुमति मिलती है। यह जवाब जावा के बजाय कोटलिन में भी है।

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}

0

यदि आप माता-पिता और बच्चे दोनों OnTouchको OnClickश्रोता चाहते हैं , तो कृपया नीचे दिए गए ट्रिक का उपयोग करें:

  1. पेरेंट व्यू के रूप में यूजर स्क्रॉलव्यू और उसके अंदर अपने बच्चे के दृश्य को रिलेटिव / लिनियर लयआउट के अंदर रखा।

  2. पेरेंट android:fillViewport="true"स्क्रोल व्यू बनाएं ताकि स्क्रॉल न हो।

  3. फिर OnTouchश्रोता को माता-पिता और OnClickश्रोता को बाल विचारों के लिए सेट करें । और दोनों श्रोता कॉलबैक का आनंद लें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.