कई बटन के लिए OnClickListener इंटरफ़ेस को लागू करने का उचित तरीका क्या है


10

मेरी Android गतिविधि में एक से अधिक बटन होते हैं जिनकी सभी को एक OnClickListener की आवश्यकता होती है। मैंने ऐसा करने के विभिन्न तरीकों को देखा है जैसे कि ::

  • गतिविधि वर्ग में इंटरफ़ेस को लागू करना
  • इंटरफ़ेस को लागू करने वाला एक अलग वर्ग बनाना
  • प्रत्येक बटन के लिए एक अनाम आंतरिक वर्ग को परिभाषित करना।

मैंने प्रत्येक दृष्टिकोण के कई उदाहरण देखे हैं। हालाँकि, यह मेरे लिए स्पष्ट नहीं है कि दूसरे के बजाय एक दृष्टिकोण का उपयोग क्यों किया जाएगा। क्या इन दृष्टिकोणों के बीच अंतर शैलीगत हैं या ऐसे कारण हैं जो एक दृष्टिकोण को बेहतर बनाते हैं?

जवाबों:


6

कई चीजों के साथ, सही दृष्टिकोण इस बात पर निर्भर करता है कि आप विशिष्ट बटन के लिए क्या करने की कोशिश कर रहे हैं और आप गतिविधि के साथ क्या कर रहे हैं।

एक्टिविटी क्लास इम्प्लीमेंट इंटरफेस :
यह एक अच्छा विकल्प है जब आपके पास केवल एक प्रकार का कार्य होता है जब इस श्रोता को बुलाया जाता है। इसका एक उदाहरण कई क्षेत्रों और एक सेव बटन के साथ एक सरल रूप होगा। मुझे यह पसंद नहीं है कि मेरे इवेंट श्रोता घटना के स्रोत की जांच करें ताकि यह तय किया जा सके कि वास्तव में क्या करना है। मुझे पता है कि कुछ कह सकते हैं कि यह एक स्टाइल की बात है, लेकिन मेरा मानना ​​है कि श्रोता को इस चेक को करने की आवश्यकता नहीं होने के कारण कोड का पालन करना आसान हो जाता है क्योंकि आपको पता चल जाएगा कि प्रत्येक ईवेंट के लिए क्या कहा जा रहा है।

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

इस कार्यान्वयन का एक अतिरिक्त लाभ है जिसे आप देखभाल कर सकते हैं। लाभ यह है कि यह अन्य वर्गों को आपके गतिविधि वर्ग के अंदर घटना को ट्रिगर करने से रोकता है। चूंकि इंटरफ़ेस विधि सार्वजनिक होनी चाहिए, वर्ग के संदर्भ वाला कोई भी व्यक्ति इस घटना को आग लगा सकता है। यदि आप चाहते हैं कि आवेदन में कौन क्या कर सकता है, उस पर ठीक-ठाक नियंत्रण हो, तो एक अलग वर्ग किसी को भी गतिविधि के संदर्भ में रोकता है ताकि आपका फॉर्म क्लियर होने या सहेजे जाने के लिए ट्रिगर हो सके या श्रोता स्रोत का उपयोग करते हुए कोड को संभावित रूप से तोड़ सके, लेकिन करता है खराब इनपुट को संभालना नहीं)।

अनाम आंतरिक श्रेणी का इंटरफ़ेस लागू होता है :
कार्यान्वयन के रूप में एक अलग वर्ग का उपयोग करने के दूसरे विकल्प के निर्माण के लिए यह वास्तव में सिर्फ एक विशिष्ट तरीका है। यह विकल्प और भी प्रतिबंधित कर सकता है, जिसके पास घटना को ट्रिगर करने की पहुंच है क्योंकि कोई भी वर्ग का एक उदाहरण नहीं बना सकता है। हालांकि, मुझे लगता है कि दो विकल्पों के बीच अधिक महत्वपूर्ण कारक कितना काम किया जा रहा है। कुछ पाठ फ़ील्ड साफ़ करना एक सरल और सीधे आगे का ऑपरेशन है। हालाँकि, के लिए सहेजने की प्रक्रिया में कई कार्य शामिल हो सकते हैं आप इनपुट (जो आपको करना चाहिए) को मान्य कर रहे हैं, मूल्यों को संग्रहीत करने और कुछ पोस्ट सेव एक्शन को ट्रिगर करने के लिए डेटाबेस में लिख रहे हैं। इस मामले में, अपनी फ़ाइल के साथ एक अलग वर्ग बनाने से इनपुट फॉर्म और डेटा प्रोसेसिंग के बीच स्पष्ट विभाजन होगा। यह बदले में कई आंतरिक कक्षाओं के साथ बड़ी फ़ाइल के बजाय प्रपत्र कोड को अंदर रखता है।


वाह, आपकी प्रतिक्रिया के लिए धन्यवाद। ओवरहेड के संदर्भ में, क्या कई श्रोता वर्ग बनाना अधिक महंगा है?
slayton

@ सेलेटन: आप जो भी करते हैं, उसके लिए हमेशा कोई कीमत नहीं होगी। सवाल यह होना चाहिए "क्या आपके लिए अंतर मायने रखता है?" अधिक ऑब्जेक्ट बनाने के लिए एक वजन है, लेकिन निष्पादन का समय लंबा होगा यदि आपके श्रोता को वास्तव में क्या करना है यह तय करने के लिए स्रोतों की एक सूची से गुजरना होगा। यदि मेमोरी का उपयोग और प्रदर्शन आपके लिए महत्वपूर्ण है, तो आपको कोड को प्रोफाइल करना चाहिए और यह तय करना चाहिए कि आपकी आवश्यकताओं के आधार पर सबसे अच्छा क्या है। हालांकि, मुझे संदेह होगा कि यह आपके कोड की बोतल गर्दन होगी। अन्यथा दिखाए जाने तक, अपने निर्णय कोड को स्पष्ट और बेहतर व्यवस्थित करें।
अपवित्र

3

चौथा तरीका लेआउट में ऑनक्लिक विशेषता सेट करना है:

<Button android:onClick="clickHandlerForButtonX" />

जो इस गतिविधि में इसी विधि है:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

दिलचस्प है, मुझे पता नहीं था कि आप ऐसा कर सकते हैं। यद्यपि यह बटन क्लिक से निपटने के लिए एक Android विशिष्ट तंत्र प्रतीत होता है।
स्लेटन

मैं आमतौर पर "एक्टिविटी क्लास इम्प्लीमेंट्स इंटरफ़ेस" के साथ जाता हूं, हालांकि - इस तरह, आपके पास एक ही जगह पर सभी संबंधित सामान हैं।
ताजनगरी

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