दिलचस्प पोस्ट
पायथन में बड़ी फ़ाइलों के MD5 हैश प्राप्त करें PHP – स्ट्रिंग में वैरिएबल सम्मिलित या सीधे सम्मिलित करें बाल तत्व पर मार्जिन मूल तत्व को स्थानांतरित करता है कैसे एक गर्म सांकेतिक शब्दों में बदलना संस्करण की लंबाई विशेषताएं? वचन के लिए लूप लिखने का सही तरीका क्या सबकुछ कोई भी नहीं है? आईएसईईक्सप्रेस के साथ एसएसएल कनेक्शन / कनेक्शन रीसेट करें बाइनरी बम – चरण 4 SQL सर्वर में सबसे छोटा अप्रयुक्त नंबर ढूंढें टास्कबार के शीर्ष पर पूर्ण स्क्रीन में एक विंडोज फॉर्म कैसे प्रदर्शित करें? SSK-PK- प्रमाणीकरण में बाद में उपयोग के लिए PKCS12 फ़ाइल से सार्वजनिक / निजी कुंजी को निकालें ताररहार्क पर मोबाइल फ़ोन ट्रैफ़िक कैप्चर करना पैनल में एक जटिल छवि जोड़ें, इसके चारों ओर एक अनुकूलित उपयोगकर्ता इंटरफ़ेस में बटन रेज़र एचटीएमएल हेल्पर एक्सटेंशन (या अन्य नामस्थानों के लिए दृश्य) नहीं मिला जावास्क्रिप्ट समापन काम नहीं कर रहा है

वास्तव में एंड्रॉइड क्या है: onClick XML विशेषता सेटऑनक्लिकलिस्ट से भिन्न होती है?

मैंने पढ़ा है कि आप दो तरीकों से एक बटन पर एक onClick हैंडलर निर्दिष्ट कर सकते हैं

android:onClick का उपयोग करना android:onClick XML विशेषता जहां आप सिर्फ एक हस्ताक्षर void name(View v) साथ एक सार्वजनिक विधि के void name(View v) का उपयोग करें या setOnClickListener विधि का उपयोग करके जहां आप OnClickListener इंटरफ़ेस को कार्यान्वित करने वाला ऑब्जेक्ट पास करते हैं बाद में अक्सर एक गुमनाम वर्ग की आवश्यकता होती है, जिसे व्यक्तिगत रूप से मुझे पसंद नहीं है (व्यक्तिगत स्वाद) या एक आंतरिक वर्ग को परिभाषित करता है जो OnClickListener लागू करता है।

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

वेब के समाधान से एकत्रित समाधान "वास्तव में एंड्रॉइड क्या है: onClick XML विशेषता सेटऑनक्लिकलिस्ट से भिन्न होती है?"

नहीं, यह कोड के माध्यम से संभव नहीं है एंड्रॉइड को परिभाषित करते समय android:onClick="someMethod" आपके लिए OnClickListener को लागू करता है android:onClick="someMethod" विशेषता।

वे दो कोड स्निपेट समान हैं, बस दो अलग-अलग तरीकों से कार्यान्वित हैं

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

 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 } 

ऊपर एक OnClickListener का कोड कार्यान्वयन है और यह 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 --> 

पृष्ठभूमि में, एंड्रॉइड जावा कोड से कुछ और नहीं करता है, एक क्लिक ईवेंट पर अपनी पद्धति को बुलाता है।

ध्यान दें कि उपर्युक्त एक्सएमएल के साथ, एंड्रॉइड केवल चालू गतिविधि में onClick method myFancyMethod() लिए दिखेगा यह याद रखना महत्वपूर्ण है कि आप टुकड़ों का उपयोग कर रहे हैं, चूंकि यदि आप किसी टुकड़े का उपयोग कर ऊपर एक्सएमएल जोड़ते हैं, तो एंड्रॉइड XML को जोड़ने के लिए उपयोग किए गए टुकड़े के .java फ़ाइल में onClick विधि की खोज नहीं करेगा।

एक और महत्वपूर्ण बात मैंने देखा आपने उल्लेख किया है कि आप गुमनाम तरीके पसंद नहीं करते हैं आप का कहना है कि आप गुमनाम कक्षाएं पसंद नहीं करते हैं

जब मैंने ऊपर जवाब देखा, तो मुझे मेरी समस्या का एहसास हुआ जो कि फैंसी विधि पर पैरामीटर (दृश्य v) नहीं डाल रहा था

 public void myFancyMethod(View v) {} 

जब इसे एक्सएमएल से एक्सेस करने की कोशिश कर रहा है

 android:onClick="myFancyMethod"/> 

आशा है कि किसी को मदद करता है

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

जांचें कि क्या आप विधि को सार्वजनिक करने में भूल गए!

android:onClick setOnClickListener Button विशेषता परिणाम में Button इंस्टेंस कॉलिंग setOnClickListener रूप से। इसलिए बिल्कुल कोई अंतर नहीं है

स्पष्ट समझ पाने के लिए, आइए देखें कि कैसे एक्सएमएल onClick एट्रिब्यूट को फ्रेमवर्क द्वारा नियंत्रित किया जाता है।

जब कोई लेआउट फ़ाइल फुलाया जाता है, तो उसमें निर्दिष्ट सभी दृश्यों को तत्काल दिया जाता है। इस विशिष्ट मामले में, Button उदाहरण public Button (Context context, AttributeSet attrs, int defStyle) निर्माता का उपयोग कर बनाया गया है। एक्सएमएल टैग के सभी गुण संसाधन बंडल से पढ़े जाते हैं और कंट्रोलर को AttributeSet रूप में पास करते हैं।

Button वर्ग को View वर्ग से विरासत में मिला है जिसके परिणामस्वरूप View कन्स्ट्रक्टर को कॉल किया जाता है, जो setOnClickListener जरिए क्लिक बैक हैंडलर को सेट करने का ध्यान setOnClickListener

एटर्स.एक्सएमएल में परिभाषित ऑनक्लिक एट्रिब्यूशन , को देखें.जावा में R.styleable.View_onClick । स्टालेबल.व्यू_ऑनक्लिक के रूप में संदर्भित किया गया है।

यहाँ View.java का कोड है जो आपके द्वारा setOnClickListener कॉल करके अपने लिए अधिकांश काम करता है

  case R.styleable.View_onClick: if (context.isRestricted()) { throw new IllegalStateException("The android:onClick attribute cannot " + "be used within a restricted context"); } final String handlerName = a.getString(attr); if (handlerName != null) { setOnClickListener(new OnClickListener() { private Method mHandler; public void onClick(View v) { if (mHandler == null) { try { mHandler = getContext().getClass().getMethod(handlerName, View.class); } catch (NoSuchMethodException e) { int id = getId(); String idText = id == NO_ID ? "" : " with id '" + getContext().getResources().getResourceEntryName( id) + "'"; throw new IllegalStateException("Could not find a method " + handlerName + "(View) in the activity " + getContext().getClass() + " for onClick handler" + " on view " + View.this.getClass() + idText, e); } } try { mHandler.invoke(getContext(), View.this); } catch (IllegalAccessException e) { throw new IllegalStateException("Could not execute non " + "public method of the activity", e); } catch (InvocationTargetException e) { throw new IllegalStateException("Could not execute " + "method of the activity", e); } } }); } break; 

जैसा कि आप देख सकते हैं, setOnClickListener को कॉलबैक को पंजीकृत करने के लिए कहा जाता है, जैसा कि हम हमारे कोड में करते हैं। केवल अंतर यह है कि यह हमारी गतिविधि में परिभाषित कॉलबैक विधि को लागू करने के लिए Java Reflection का उपयोग करता है

अन्य उत्तरों में उल्लेखित मुद्दों के कारण यहां दिए गए हैं:

  • कॉलबैक विधि सार्वजनिक होना चाहिए : चूंकि Java Class getMethod का उपयोग किया जाता है, इसलिए केवल सार्वजनिक एक्सेस Java Class getMethod साथ कार्य करने के लिए खोज की जाती है। अन्यथा IllegalAccessException अपवाद को संभालने के लिए तैयार रहें
  • getContext().getClass().getMethod() साथ बटन का उपयोग करते समय, कॉलबैक को गतिविधि : getContext().getClass().getMethod() में परिभाषित किया जाना चाहिए getContext().getClass().getMethod() कॉल विधि को वर्तमान संदर्भ में प्रतिबंधित करता है, जो कि टुकड़ा के मामले में गतिविधि है। इसलिए विधि कक्षा के भीतर खोज की जाती है और खंड नहीं।
  • कॉलबैक विधि को स्वीकार करना चाहिए पैरामीटर : Java Class getMethod विधि के लिए खोज करता है जो View.class पैरामीटर के रूप में स्वीकार करता है।

ध्यान दें कि यदि आप onClick XML सुविधा का उपयोग करना चाहते हैं, तो संबंधित विधि का एक पैरामीटर होना चाहिए, जिसका प्रकार XML ऑब्जेक्ट से मेल खाना चाहिए।

उदाहरण के लिए, एक बटन को अपनी पद्धति से नाम स्ट्रिंग के माध्यम से लिंक किया जाएगा: android:onClick="MyFancyMethod" लेकिन विधि घोषणा को दिखाना चाहिए: ...MyFancyMethod(View v) {...

यदि आप इस सुविधा को किसी मेनू आइटम में जोड़ने का प्रयास कर रहे हैं, तो उसके पास एक्सएमएल फ़ाइल में सटीक समान वाक्यविन्यास होगा, लेकिन आपकी विधि को इस रूप में घोषित किया जाएगा ...MyFancyMethod(MenuItem mi) {...

यहां बहुत अच्छी तरह से उत्तर दिए गए हैं, लेकिन मैं एक पंक्ति जोड़ना चाहता हूं:

android:onclick एक्सएमएल में android:onclick , एंड्रॉइड इस बात को संभालने के लिए दृश्य के पीछे जावा प्रतिबिंब का उपयोग करता है।

और जैसा कि यहां बताया गया है, प्रतिबिंब हमेशा प्रदर्शन को धीमा कर देता है (विशेष रूप से धल्विक वीएम पर)। onClickListener पंजीकरण एक बेहतर तरीका है।

जावा 8 के साथ, संभवतः आप जो चाहें हासिल करने के लिए विधि संदर्भ का उपयोग कर सकते हैं।

मान लें कि यह एक बटन के लिए आपके onClick ईवेंट हैंडलर है।

 private void onMyButtonClicked(View v) { if (v.getId() == R.id.myButton) { // Do something when myButton was clicked } } 

फिर, आप पर onMyButtonClicked setOnClickListener() कॉल इस तरह की तरह एक setOnClickListener() उदाहरण विधि संदर्भ।

 Button myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(this::onMyButtonClicked); 

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

पुनश्च। उन लोगों के लिए जो वास्तव में एंड्रॉइड में जावा 8 भाषा की सुविधा का उपयोग कर सकते हैं, यह रिटालॉल्ब्डा लाइब्रेरी का सौजन्य है।

क्लिक श्रोता पर सेट करने का दूसरा तरीका एक्सएमएल का उपयोग करना होगा। बस एंड्रॉइड जोड़ें: आपके टैग पर onClick विशेषता

जब भी संभव हो तो अज्ञात जावा वर्ग पर XML विशेषता "onClick" का उपयोग करने के लिए यह एक अच्छा अभ्यास है।

सबसे पहले, हम कोड में अंतर को देख सकते हैं:

XML विशेषता / ऑनक्लिक विशेषता

एक्सएमएल भाग

 <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button1" android:onClick="showToast"/> 

जावा भाग

 public void showToast(View v) { //Add some logic } 

अनाम जावा क्लास / सेटऑनक्लिकलिस्ट

एक्सएमएल भाग

 <Button android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

जावा भाग

 findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { //Add some logic } }); 

यहां अज्ञात जावा वर्ग पर XML विशेषता का उपयोग करने के लाभ हैं:

  • अनाम जावा वर्ग के साथ हमें हमेशा हमारे तत्वों के लिए एक आईडी निर्दिष्ट करना पड़ता है, लेकिन XML विशेषता आईडी को छोड़ा जा सकता है।
  • बेनामी जावा वर्ग के साथ हमें सक्रिय रूप से दृश्य (findViewById भाग) के अंदर तत्व खोजना होगा, लेकिन XML विशेषता के साथ एंड्रॉइड हमारे लिए यह करता है
  • बेनामी जावा वर्ग को कम से कम 5 लाइनों की आवश्यकता होती है, जैसा कि हम देख सकते हैं, लेकिन एक्सएमएल विशेषता के साथ 3 लाइनें कोड पर्याप्त हैं
  • बेनामी जावा वर्ग के साथ हमें हमारे "onClick" विधि का नाम देना है, लेकिन XML विशेषता से हम किसी भी नाम को जोड़ सकते हैं, जो हमारे कोड की पठनीयता के साथ नाटकीय ढंग से मदद करेगा।
  • एपीआई स्तर 4 रिलीज के दौरान एक्सएमएल "ऑनक्लिक" विशेषता को Google द्वारा जोड़ दिया गया है, जिसका अर्थ है कि यह थोड़ा अधिक आधुनिक वाक्यविन्यास है और आधुनिक वाक्यविन्यास लगभग हमेशा बेहतर होता है

बेशक, एक्सएमएल विशेषता का प्रयोग करना हमेशा संभव नहीं होता है, ये कारण हैं कि हम इसे क्यों नहीं चुना होगा:

  • अगर हम टुकड़ों के साथ काम कर रहे हैं onClick विशेषता केवल एक गतिविधि में जोड़ दी जा सकती है, इसलिए यदि हमारे पास एक टुकड़ा है, तो हमें एक गुमनाम कक्षा का उपयोग करना होगा।
  • अगर हम onClick श्रोता को एक अलग कक्षा में ले जाना चाहते हैं (हो सकता है कि यह बहुत जटिल है और / या हम इसे अपने आवेदन के विभिन्न हिस्सों में पुनः उपयोग करना चाहते हैं), तो हम XML विशेषता का उपयोग नहीं करना चाहते हैं या तो।

रुइवो के उत्तर का समर्थन करने के लिए, हाँ, आपको एंड्रॉइड के एक्सएमएल ऑनक्लिक में इस्तेमाल करने में सक्षम होने के लिए विधि "सार्वजनिक" घोषित करना होगा – मैं एपीआई स्तर 8 (मिनएसडीके …) से 16 (लक्ष्य एसडीके …) तक एक ऐप्प लक्ष्यीकरण विकसित कर रहा हूं।

मैं अपने तरीके को निजी के रूप में घोषित कर रहा था और इसके कारण त्रुटि उत्पन्न हुई, सिर्फ सार्वजनिक कार्यों के रूप में इसे महान घोषित किया

  Add Button in xml and give onclick attribute name that is the name of Method. <!--xml --!> <Button android:id="@+id/btn_register" android:layout_margin="1dp" android:onClick="addNumber" android:text="Add" /> Button btnAdd = (Button) findViewById(R.id.mybutton); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { addNumber(v); } }); Private void addNumber(View v){ //Logic implement switch (v.getId()) { case R.id.btnAdd : break; default: break; }} 

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

हां, आप अपने fragment या activity कार्यान्वित कर सकते हैं देखें। View.OnClickListener

और जब आप कोड में अपना नया दृश्य ऑब्जेक्ट्स प्रारंभ करते हैं तो आप बस mView.setOnClickListener(this); कर सकते हैं mView.setOnClickListener(this);

और यह स्वतः सभी ऑब्जेक्ट ऑब्जेक्ट को onClick(View v) विधि का उपयोग करने के लिए सेट करता है जो आपके fragment या activity आदि में है।

जिस दृश्य ने onClick विधि को बुलाया है यह अंतर करने के लिए, आप v.getId() विधि पर एक स्विच स्टेटमेंट का उपयोग कर सकते हैं।

यह जवाब एक से अलग है जो कहते हैं, "नहीं, यह कोड के माध्यम से संभव नहीं है"

मान लीजिए, आप इस main.xml जैसे क्लिक ईवेंट जोड़ना चाहते हैं

 <Button android:id="@+id/btn_register" android:layout_margin="1dp" android:layout_marginLeft="3dp" android:layout_marginTop="10dp" android:layout_weight="2" android:onClick="register" android:text="Register" android:textColor="#000000"/> 

जावा फाइल में, आपको इस पद्धति की तरह एक विधि लिखना होगा।

 public void register(View view) { } 

मैं यह कोड xml फ़ाइल में लिख रहा हूँ …

 <Button android:id="@+id/btn_register" android:layout_margin="1dp" android:layout_marginLeft="3dp" android:layout_marginTop="10dp" android:layout_weight="2" android:onClick="register" android:text="Register" android:textColor="#000000"/> 

और यह कोड टुकड़े में लिखें …

 public void register(View view) { } 

ऐसा करने का सबसे अच्छा तरीका निम्न कोड के साथ है:

  Button button = (Button)findViewById(R.id.btn_register); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //do your fancy method } }); 

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

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

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

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

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