XML बनाम OnClickListener में Android पर क्लिक करें


86

मुझे एहसास है कि एक समान शब्द वाला प्रश्न पहले पूछा गया है, लेकिन यह अलग है। मैं Android ऐप्स विकसित करने में बहुत नया हूं और android:onclick=""XML विशेषता और setOnClickListenerविधि के बीच अंतर के बारे में मेरे पास तीन प्रश्न हैं ।

  1. दोनों में क्या मतभेद हैं? संकलित समय या रन टाइम या दोनों में पाए जाने वाले दो कार्यान्वयनों के बीच अंतर है?

  2. कौन से उपयोग के मामले किस कार्यान्वयन के अनुकूल हैं?

  3. एंड्रॉइड में टुकड़ों के उपयोग से क्या अंतर होता है?


1
# 2 के लिए: xml का उपयोग करते समय आपको सावधान रहना चाहिए onclickक्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि हर वर्ग उस पद्धति को लागू करता है। यह मान रहा है कि आप लेआउट का एक से अधिक बार उपयोग कर रहे हैं। हालाँकि, यदि आपके पास यह सुनिश्चित करने के लिए जावा इंटरफ़ेस है कि यह विधि सभी वर्गों में है जिसने इसे लागू किया है, तो आपको चिंता करने की आवश्यकता नहीं होगी।
21

एक जावा इंटरफ़ेस नहीं होगा जैसा कि आपने वर्णित किया है कि ऑनक्ली लिस्टनर का विस्तार या निहितार्थ बहुत अधिक है?
KG6ZVP

मैंने पहले इस पर ध्यान दिया है और मुझे लगता है कि इसमें वरीयता की तुलना में थोड़ा अधिक है, लेकिन मुझे खेद है कि मैं कुछ और नहीं कह सकता क्योंकि यह थोड़ी देर के लिए है। मुझे पसंद है android:onclickजब यह सुविधाजनक है, लेकिन मुझे पता है कि कभी-कभी यह मुद्दों का कारण बना है, और मैं उन दोनों को याद नहीं कर सकता :)
Uxonith

xml onClick नेस्टेड लेआउट तत्वों के लिए काम नहीं करता है जो गतिशील रूप से एपीआई स्तर 19 में फुलाए जाते हैं
अमित कौशिक

1
मैंने शायद ही कभी एंड्रॉइड को लागू करने वाले अन्य लोगों से कोड देखा हो: onClick और यह सबसे भ्रामक है जब आप किसी अन्य के माध्यम से कोड देखते हैं। के रूप में यह setOnClickListener की लगभग सभी संभावनाओं का उपयोग नहीं किया है, लगभग हर कोई मेरी राय में केवल setOnClickListener का उपयोग करता है
क्रिश्चियन

जवाबों:


122

OnClickListener बनाम OnClick के बीच अंतर:

  • OnClickListener वह इंटरफ़ेस है जिसे आपको कार्यान्वित करने की आवश्यकता है और जावा कोड में एक दृश्य में सेट किया जा सकता है।
  • OnClickListener वह है जो वास्तव में क्लिक करने के लिए किसी का इंतजार करता है, जब कोई क्लिक करता है तो ऑनक्लिक निर्धारित करता है।
  • हाल ही में Android ने एंड्रॉइड: ओनलाइन पर विचार करने के लिए एक xml विशेषता जोड़ी, जिसका उपयोग किसी भी इंटरफ़ेस को लागू करने की आवश्यकता के बिना दृश्य की गतिविधि में सीधे क्लिक को संभालने के लिए किया जा सकता है।
  • आप आसानी से एक श्रोता कार्यान्वयन को दूसरे के साथ स्वैप कर सकते हैं यदि आपको आवश्यकता है।
  • एक OnClickListener आपको इवेंट को ट्रिगर करने वाले दृश्य से क्लिक इवेंट की क्रिया / व्यवहार को अलग करने में सक्षम बनाता है। जबकि साधारण मामलों के लिए यह जटिल घटना से निपटने के लिए इतना बड़ा सौदा नहीं है, इसका मतलब कोड की बेहतर पठनीयता और स्थिरता हो सकता है
  • चूंकि OnClickListener एक इंटरफ़ेस है, इसलिए उस वर्ग को लागू करने के लिए उसमें परिवर्तनशील चर और तरीकों को निर्धारित करने के लिए लचीलापन होता है, जो उसको कार्यान्वित करता है। फिर से, साधारण मामलों में यह कोई बड़ी बात नहीं है, लेकिन जटिल मामलों के लिए, हम उन चर / विधियों को जोड़ना नहीं चाहते हैं जो ईवेंट हैंडलिंग से संबंधित इवेंट हैंडलिंग से संबंधित हैं जो इवेंट को ट्रिगर करता है।
  • XML लेआउट में फ़ंक्शन बाइंडिंग के साथ onClick onClick और फ़ंक्शन के बीच एक बाइंडिंग है जिसे वह कॉल करेगा। फ़ंक्शन को चालू करने के लिए फ़ंक्शन के पास एक तर्क (दृश्य) होना चाहिए।

दोनों एक ही तरह से कार्य करते हैं, बस एक जावा कोड और दूसरा xml कोड के माध्यम से सेट हो जाता है।

setOnClickListener कोड कार्यान्वयन:

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

XML कार्यान्वयन:

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

प्रदर्शन:

प्रदर्शन में दोनों समान हैं। संकलन करते समय Xml को बाइनरी कोड में प्री-पार्स किया गया है। इसलिए Xml में कोई ओवर-हेड नहीं है।

सीमा:

android: onClick API स्तर 4 के बाद के लिए है, इसलिए यदि आप <1.6 को लक्षित कर रहे हैं, तो आप इसका उपयोग नहीं कर सकते।


`Xml को संकलित करते हुए बाइनरी कोड में प्री-पार्स किया गया है` इस कथन का वास्तव में क्या मतलब है? जब से मैंने एक एपीके का डीएक्सकोड देखा है जिसमें एंड्रॉइड है: अपनी मैनिफ़ेस्ट फ़ाइल में क्लिक करें, लेकिन मुझे ऐसा कोई कोड नहीं मिला जो स्पष्ट रूप से श्रोता को सेट करे
विकक्स

जबरदस्त व्याख्या। +1
ज़िया उर रहमान

1
दरअसल, XML में कुछ ओवरहेड है । जब पहली बार बटन पर क्लिक किया जाता है , तो उस विधि को निर्धारित करने के लिए प्रतिबिंब का उपयोग किया जाता है जिसे लागू किया जाना चाहिए । हालांकि, यह संभवतः अधिकांश उपयोग-मामलों के लिए नगण्य है (और समय से पहले अनुकूलन सभी बुराई की जड़ है)।
योएल

21

मैं हैरान हूं कि किसी ने इस बारे में बात नहीं की, लेकिन सावधान रहें, हालांकि android:onClickक्लिक को संभालने के लिए एक्सएमएल एक सुविधाजनक तरीका लगता है, setOnClickListenerकार्यान्वयन जोड़ने से कुछ अतिरिक्त है onClickListener। वास्तव में, इसने दृश्य संपत्ति clickableको सत्य बना दिया।

हालांकि यह अधिकांश एंड्रॉइड कार्यान्वयनों पर एक समस्या नहीं हो सकती है, फोन निर्माता के अनुसार, बटन हमेशा क्लिक करने योग्य = सत्य के लिए डिफ़ॉल्ट होता है, लेकिन कुछ फोन मॉडल पर अन्य कंस्ट्रक्टरों में गैर-बटन दृश्यों पर डिफ़ॉल्ट क्लिक करने योग्य = गलत हो सकता है।

तो XML को सेट करना पर्याप्त नहीं है, आपको android:clickable="true"नॉन बटन पर जोड़ने के लिए हर समय सोचना होगा , और यदि आपके पास कोई ऐसा डिवाइस है जहां डिफ़ॉल्ट क्लिक करने योग्य है = सही है और आप इस XML विशेषता को डालने के लिए एक बार भी भूल जाते हैं, तो आप ध्यान नहीं देंगे रनटाइम पर समस्या लेकिन बाजार पर प्रतिक्रिया तब मिलेगी जब यह आपके ग्राहकों के हाथों में होगा!

इसके अलावा, हम कभी भी इस बारे में निश्चित नहीं हो सकते हैं कि प्रोगार्ड एक्सएमएल विशेषताओं और क्लास पद्धति को कैसे बाधित और नाम बदलेगा, इसलिए 100% सुरक्षित नहीं है कि उनके पास एक दिन कभी बग नहीं होगा।

इसलिए यदि आप कभी परेशानी नहीं चाहते हैं और इसके बारे में कभी नहीं सोचते हैं, तो setOnClickListenerएनोटेशन के साथ बटरकाइफ़ जैसी लाइब्रेरियों का उपयोग करना बेहतर है।@OnClick(R.id.button)


1
क्या आपके पास कोई अनुभव (या कहीं देखा) जो बग का उपयोग करते समय आपत्ति के कारण हुआ android:onClick?
अकरम

धन्यवाद महोदय! आपका उत्तर बहुत मददगार है!
यी शेन

12

सीधे शब्दों में:

यदि आपके पास android:onClick = "someMethod" xml है , तो यह public void someMethodआपके गतिविधि वर्ग में दिखता है । आपकी गतिविधि सेOnClickListener सही कहा जाता है और यह कुछ विशेष से जुड़ा हुआ है । उदाहरण के लिए और नीचे दिए गए कोड में कहा गया है कि दबाने पर क्या करना है ।ViewsomeButton.setOnClickListenersomeButton

आशा करता हूँ की ये काम करेगा :)


4

जैसा कि पहले कहा गया था: वे दोनों एक घटना के जवाब में तर्क जोड़ने का एक तरीका है, इस मामले में एक 'क्लिक' घटना है।

मैं तर्क और प्रस्तुति के बीच एक अलगाव के लिए जाऊंगा, ठीक वैसे ही जैसे हम HTML / जावास्क्रिप्ट दुनिया में करते हैं: प्रस्तुति के लिए XML छोड़ दें और कोड के माध्यम से घटना श्रोताओं को जोड़ें।


1
सहमत, जब तक कि यह कुछ सरल व्यवहार के साथ एक बहुत ही छोटा ऐप नहीं है, तब तक आपके सभी निष्पादित कोड को अलग और अच्छी तरह से व्यवस्थित रखा जाना चाहिए, अधिमानतः अलग-अलग तरीकों का उपयोग करके
OzzyTheGiant

0

यदि आपके पास केवल एक विधि का उपयोग करने वाले कई बटन हैं, तो मेरा सुझाव है कि इसे जावा में करें। लेकिन अगर आपके पास एक विशिष्ट विधि के साथ एक बटन है, तो एक्सएमएल में क्लिक करना बेहतर होगा।


0

यह हमेशा एंड्रॉइड का उपयोग करने के लिए अधिक सुविधाजनक है: onClick विशेषता जब तक आपके पास एक अच्छा कारण नहीं है, उदाहरण के लिए, यदि आप रनटाइम पर बटन को तुरंत करते हैं या आपको एक खंड उपवर्ग में क्लिक व्यवहार की घोषणा करने की आवश्यकता होती है।


3
मैंने शायद ही कभी एंड्रॉइड को लागू करने वाले अन्य लोगों से कोड देखा हो: onClick और यह सबसे भ्रामक है जब आप किसी अन्य के माध्यम से कोड देखते हैं। यह setOnClickListener की संभावनाओं नहीं सब लगभग everbody का उपयोग करता है केवल मेरी राय में setOnClickListener है के रूप में
ईसाई

0

ऐसे कुछ कारण हैं जिनकी वजह से आप प्रोग्राम करना चाहते हैं OnClickListener। पहला यह है कि यदि आप कभी अपने ऐप के चालू होने के दौरान अपने बटन के व्यवहार को बदलना चाहते हैं। आप अपने बटन को किसी अन्य विधि पर पूरी तरह से इंगित कर सकते हैं, या बस बटन को अक्षम कर OnClickListenerसकते हैं जो कुछ भी नहीं करता है।

जब आप onClickविशेषता का उपयोग करते हुए एक श्रोता को परिभाषित करते हैं , तो दृश्य केवल उस नाम के साथ एक विधि की तलाश करता है जो उसकी मेजबान गतिविधि में है। प्रोग्रामेटिक रूप OnClickListenerसे आपको इसकी होस्ट गतिविधि के अलावा कहीं और से एक बटन के व्यवहार को नियंत्रित करने की अनुमति देता है। यह बहुत प्रासंगिक हो जाएगा जब हम उपयोग करते हैं Fragments, जो मूल रूप से मिनी गतिविधियां हैं, जो आपको अपने स्वयं के जीवनचक्र के साथ विचारों के पुन: प्रयोज्य संग्रह का निर्माण करने की अनुमति देता है, जिसे फिर गतिविधियों में इकट्ठा किया जा सकता है। फ्रैगमेंट को हमेशा OnClickListenersअपने बटन को नियंत्रित करने के लिए उपयोग करने की आवश्यकता होती है , क्योंकि वे गतिविधियां नहीं हैं, और ऑनक्लिक में परिभाषित श्रोताओं के लिए खोज नहीं की जाएगी।


-2

मुझे लगता है कि उनके बीच मुख्य अंतर यह है:

OnClick: जब आप अपनी उंगली से बटन पर क्लिक करते हैं।

OnClickListner: यह एक व्यापक विकल्प हो सकता है जिसे विभिन्न कोडों में लागू किया जाए।

उदाहरण के लिए जब आप url "ymail.com" टाइप करते हैं, तो याहू आपके उपयोगकर्ता नाम और आपके पासवर्ड को आपके ब्राउज़र से ढूंढता है और आपके मेल को खोलने के लिए राज्य बटन पर क्लिक करता है। यह क्रिया केवल onClickListener पर लागू की जानी चाहिए।

यह मेरा विचार है!


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