एक onclick श्रोता निकालें


194

मेरे पास एक ऑब्जेक्ट है जहां पाठ चक्र और स्थिति संदेश प्रदर्शित करता है। जब संदेश बदलते हैं, तो मैं चाहता हूं कि वस्तु का क्लिक इवेंट आपको उस गतिविधि पर ले जाए जहां संदेश संबंधित है।

इसलिए, मेरे पास एक TextView mTitleViewघटना है और मैं इस तरह का आयोजन कर रहा हूं।

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

मैं उस ईवेंट को कैसे हटाऊं? कुछ स्थिति संदेश हैं जिनके पास कोई कार्रवाई योग्य क्षेत्र नहीं है, इसलिए मैं क्लिक ईवेंट को बंद करना चाहूंगा। मैं इन क्लिक घटनाओं के माध्यम से साइकिल चलाना और उन्हें ठीक से निपटाना भी चाहूंगा, लेकिन मैं सबसे अच्छे अभ्यास के बारे में अनिश्चित हूं।

जवाबों:


417

mTitleView.setOnClickListener(null) चाल चलनी चाहिए।

एक बेहतर डिज़ाइन हो सकता है कि ऑनक्लेक्लिस्टेनर में स्थिति की जांच करें और फिर यह निर्धारित करें कि क्लिक श्रोताओं को जोड़ने और साफ़ करने के लिए क्लिक कुछ करना चाहिए या नहीं।


1
कोई अन्य सफाई नहीं है जो मुझे घटना को समाप्त करने के लिए करना है?
जोश

2
नहीं। श्रोता सिर्फ एक वस्तु है जिसे देखने के लिए एक विधि को कॉल करने के लिए उपयोग किया जाता है जब आप क्लिक करते हैं तो जब आप इसे शून्य करने के लिए सेट करते हैं तो यह इसे नष्ट कर देता है।
रॉबी पॉन्ड

15
मुझे आश्चर्य है कि अगर श्रोताओं को स्मृति आवंटन का कारण बनता है? क्या हमें उन्हें मुक्त करने की आवश्यकता है? क्या इससे ऐप का प्रदर्शन बढ़ जाएगा?
एलिकेनब्यूरट

2
आपके उत्तर के लिए धन्यवाद, मन जोड़ने से आप यह क्यों सोचते हैं कि श्रोता में स्थिति या झंडे की जाँच करना बेहतर है।
kapv89

2
जब आप कहते a better designहैं कि आप प्रदर्शन प्रभाव डाल रहे हैं या आप कह रहे हैं कि यह थोड़ा अरुचिकर है?
RTF

132

ध्यान दें कि यदि कोई दृश्य गैर-क्लिक करने योग्य है (उदाहरण के लिए एक TextView), तो सेटिंग setOnClickListener(null)का अर्थ होगा कि देखने योग्य है। mMyView.setClickable(false)यदि आप चाहते हैं कि आपका दृश्य क्लिक करने योग्य न हो तो उपयोग करें । उदाहरण के लिए, यदि आप पृष्ठभूमि के लिए एक xml ड्रा करने योग्य का उपयोग करते हैं, जो विभिन्न राज्यों के लिए अलग-अलग रंग दिखाता है, यदि आपका दृश्य अभी भी क्लिक करने योग्य है, तो उपयोगकर्ता उस पर क्लिक कर सकते हैं और अलग-अलग पृष्ठभूमि का रंग दिखाई देगा, जो अजीब लग सकता है।


यह TextView और ऐसे के लिए जानना अच्छा है, लेकिन एक ListView के लिए इसका कोई प्रभाव नहीं है जब एक OnClickListener पहले सेट किया गया था।
किसी ने

4
यही कारण है कि मैंने "ध्यान दें कि यदि कोई दृश्य गैर-क्लिक करने योग्य है (उदाहरण के लिए एक टेक्स्ट दृश्य)" - एक सूची दृश्य क्लिक करने योग्य है और इसलिए यह इसके लिए काम नहीं करता है।
FreewheelNat

अगर मुझे मेरी राय में दृश्य के onClickListener को अक्षम / सक्षम करने के लिए आगे और पीछे स्विच करने की आवश्यकता है, तो यह setOnClickListener (नल) सेट करने से बेहतर समाधान है।
पाणिनि लंचर

1
view.setOnClickListener (शून्य) view.setClickable (झूठी) के साथ एक साथ सही जवाब है, धन्यवाद !!!!
पेट्रोस मस्ट्रेंटनस

12

शायद setOnClickListener(null)?


1
यह विशेष रूप से चेकबॉक्स के लिए काम नहीं करता है, और संभवतः अन्य विजेट के लिए भी काम नहीं करेगा।
क्रिस

8

setOnClickListener(null)रनटाइम पर क्लिक श्रोता को हटाने के लिए सेटिंग एक अच्छा विचार है।

और यह भी कोई टिप्पणी की है कि फोन करने View.hasOnClickListeners()के बाद यह वापस आ जाएगी true, कोई मेरे दोस्त।

यहाँ कक्षा hasOnClickListeners()से लिया गया कार्यान्वयन हैandroid.view.View

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

भगवान का शुक्र है। इसकी जांच करता है null

इसलिए सब कुछ सुरक्षित है। का आनंद लें :-)


4

उपर्युक्त उत्तर स्पष्ट और अविश्वसनीय लगते हैं। मैंने एक साधारण रिलेटिव लेआउट में ImageView के साथ ऐसा करने की कोशिश की और यह ऑनक्लिक इवेंट को डिसेबल नहीं किया।

मेरे लिए जो काम किया गया था वह सेट इनेबल्ड का उपयोग कर रहा था।

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

फिर आप यह देख सकते हैं कि क्या दृश्य सक्षम है:

boolean ImageView.isEnabled();

एक अन्य विकल्प एक दृश्य की स्थिति निर्धारित करने के लिए setContentDescription (स्ट्रिंग स्ट्रिंग) और स्ट्रिंग getContentDescription () का उपयोग करना है।



3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);

            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);

            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

0

बस नीचे के रूप में आइटम को पुन: सक्रिय करने की चाल होगी। यह आइटम पर आधारित onclick, onlonglick, onitemclick, onitemlongclick को हटा देगा

mTitleView = findViewById (R.id.mTitleView);

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