2012-01-23 22 views
57

संभव डुप्लिकेट:
Difference between OnClick() event and OnClickListener?श्रोताओं बटन पर क्लिक करें

मैं Android विकास के लिए अर्द्ध नया हूँ और जब मैं पहली बार शुरू किया मैं किसी भी द्वारा XML लेआउट का उपयोग कर से बचने के लिए करने की कोशिश की इसका मतलब है कि मेरी कुछ पिछली परियोजनाओं में ऐसे बटन शामिल हैं जो स्पष्ट रूप से ऑनक्लिक लिस्टनर बनाते हैं और इसे अज्ञात आंतरिक वर्ग के रूप में कार्यान्वित करते हैं। जैसे -

final Button button = new Button(this); 
button.setText("Click to change second line of text"); 

OnClickListener buttonListener = new View.OnClickListener() { 
    boolean clicked = false; 
    int numClicks = 0; 

    @Override 
    public void onClick(View v) { 
     if(numClicks > 5) { 
      button.setText("STOP IT"); 
     } 
     numClicks++; 
     if(clicked == false){ 
      clicked = true; 
      tv2.setText("Text Changed on Button Click");  
     } 
     else 
     { 
      clicked = false; 
      tv2.setText("Click again"); 
     }  
    } 
}; 
button.setOnClickListener(buttonListener); 

लेकिन जैसा कि मैंने एंड्रॉयड से अधिक परिचित मिल गया, मैं इस

<Button 
    android:id="@+id/button1" 
    android:layout_height = "wrap_content" 
    android:layout_width ="wrap_content" 
    android:text = "lets do this" 
    android:onClick = "DoIt" 
    /> 

लेआउट एक्सएमएल में, जहां छदाम परिभाषित किया गया था की तरह एक्सएमएल लेआउट के मूल्य और लागू बटन को समझने लगे जावा में

मेरा सवाल है, क्या ये 2 विधियां कार्यात्मक रूप से एक ही चीज़ हैं? क्या दृश्यों के पीछे कहीं संकलक द्वारा ऑनक्लिक लिस्टनर परिभाषित किया जा रहा है? क्या कोई ऐसी विशेषताएं हैं जो आप एक तरफ या दूसरे का उपयोग कर व्यापार करते हैं?

+1

संभाल लेंगे [यहां विरासत में मिला विधि onClick() जोड़ने की जरूरत है अपने onCreate()

button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(this); 

में जोड़ना है एक उपयोगी चर्चा है ] (http://stackoverflow.com/a/7453469/1154026) मुझे लगता है कि आपके प्रश्न के साथ मदद मिलेगी। – VicVu

+0

आप क्लिक श्रोता को तीन तरीकों से सेट कर सकते हैं, 1. प्रत्येक तत्व के लिए व्यक्तिगत क्लिक श्रोता सेट करना। 2. गतिविधि में OnClickListener लागू। 3. बटन को संभालने के लिए एक अलग फ़ंक्शन बनाना और इस फ़ंक्शन को xml में जोड़ें। आप यहां इन उदाहरणों को पा सकते हैं http://wiki.workassis.com/android-three-ways-to-set-click-listener/ –

उत्तर

139

ये बिल्कुल वही हैं। को एपीआई स्तर 4 में जोड़ा गया ताकि इसे आसान, अधिक जावास्क्रिप्ट-वेब-जैसी, और एक्सएमएल से सबकुछ ड्राइव किया जा सके। यह आंतरिक रूप से क्या करता है बटन पर OnClickListener जोड़ता है, जो आपकी DoIt विधि को कॉल करता है।

Button button= (Button) findViewById(R.id.buttonId); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DoIt(v); 
    } 
}); 

केवल एक चीज आप का उपयोग करके बंद व्यापार, एक्सएमएल विन्यास के साथ हमेशा की तरह, कि यह गतिशील सामग्री जोड़ने के लिए (प्रोग्राम के थोड़ा और मुश्किल हो जाता है है:

यहाँ एक android:onClick="DoIt" का उपयोग कर आंतरिक रूप से करता है , आप अपने चर के आधार पर एक श्रोता या अन्य जोड़ने का निर्णय ले सकते हैं)। लेकिन यह DoIt विधि के भीतर अपना परीक्षण जोड़कर आसानी से पराजित हो जाता है।

+0

उत्कृष्ट उत्तर। एक्सएमएल के माध्यम से कॉलबैक सेट करते समय दृश्यों के पीछे एंड्रॉइड क्या करता है, यह बताने के लिए धन्यवाद। –

+5

यह ध्यान देने योग्य है कि 'एंड्रॉइड: ऑनक्लिक' एक खंड में परिभाषित विधि के साथ काम नहीं करेगा। सबसे अच्छा समाधान imho सिर्फ श्रोताओं को टुकड़े के भीतर संलग्न करने के लिए है। अधिक जानकारी के लिए: http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments – adamdport

+0

संक्षिप्त स्पष्टीकरण के लिए धन्यवाद। – JoeYo

0

भले ही आप एक्सएमएल में एंड्रॉइड: ऑनक्लिक = "DoIt" को परिभाषित करते हैं, आपको यह सुनिश्चित करना होगा कि आपकी गतिविधि (या संदर्भ देखें) में समान विधि के साथ परिभाषित सार्वजनिक विधि है और पैरामीटर के रूप में देखें। एंड्रॉइड गतिविधि में इस कार्यान्वयन के साथ आपकी परिभाषाओं को तार देता है। अंत में, कार्यान्वयन में एक ही कोड होगा जिसे आपने अनाम आंतरिक कक्षा में लिखा था। इसलिए, गतिविधि में आंतरिक वर्ग और श्रोता अटैचमेंट होने के बजाय सरल शब्दों में, आपके पास कार्यान्वयन कोड के साथ बस एक सार्वजनिक विधि होगी।

+1

मैंने इसे अपने जावा में लागू किया है, मैंने अभी इसे पोस्ट नहीं किया क्योंकि विधि प्रश्न के लिए प्रासंगिक नहीं थी। – SmashCode

2

एक्सएमएल का उपयोग करके, आपको ऑनक्लिक श्रोता को स्वयं सेट करने की आवश्यकता है। सबसे पहले अपने वर्ग implements OnClickListener तो जोड़ने चर Button button1; फिर जब आप OnClickListener लागू आप जहां आप अपने क्लिक

संबंधित मुद्दे