उदाहरण के लिए आंतरिक रूप से कॉलिंग android:onClick
में विशेषता परिणाम निर्दिष्ट करना । इसलिए बिल्कुल कोई अंतर नहीं है।Button
setOnClickListener
स्पष्ट समझ रखने के लिए, आइए देखें कि एक्सएमएल onClick
विशेषता को फ्रेमवर्क द्वारा कैसे नियंत्रित किया जाता है।
जब एक लेआउट फ़ाइल को फुलाया जाता है, तो इसमें निर्दिष्ट सभी दृश्य त्वरित होते हैं। इस विशिष्ट मामले में, निर्माता Button
का उपयोग करके उदाहरण बनाया public Button (Context context, AttributeSet attrs, int defStyle)
गया है। XML टैग में सभी विशेषताएँ संसाधन बंडल से पढ़ी जाती हैं और AttributeSet
निर्माणकर्ता के पास भेज दी जाती हैं ।
Button
क्लास को क्लास से विरासत में मिला है View
जिसके परिणामस्वरूप View
कंस्ट्रक्टर को बुलाया जाता है, जो क्लिक कॉल बैक हैंडलर के माध्यम से सेटिंग का ख्याल रखता है setOnClickListener
।
OnClick विशेषता को attrs.xml में परिभाषित किया गया है , इसे View.java के रूप में संदर्भित किया जाता है 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
इसका उपयोग किया जाता है, इसलिए केवल सार्वजनिक पहुंच विनिर्देशक वाले कार्यों की खोज की जाती है। अन्यथा IllegalAccessException
अपवाद को संभालने के लिए तैयार रहें ।
- Fragment में OnClick के साथ Button का उपयोग करते समय, कॉलबैक को गतिविधि में परिभाषित किया जाना चाहिए :
getContext().getClass().getMethod()
कॉल वर्तमान खोज के लिए विधि खोज को प्रतिबंधित करता है, जो Fragment के मामले में गतिविधि है। इसलिए गतिविधि गतिविधि वर्ग के भीतर खोज की जाती है न कि फ्रैगमेंट क्लास।
- कॉलबैक विधि को पैरामीटर को स्वीकार करना चाहिए : चूंकि
Java Class getMethod
विधि की खोज होती है जो View.class
पैरामीटर के रूप में स्वीकार करता है।