उदाहरण के लिए आंतरिक रूप से कॉलिंग android:onClickमें विशेषता परिणाम निर्दिष्ट करना । इसलिए बिल्कुल कोई अंतर नहीं है।ButtonsetOnClickListener
स्पष्ट समझ रखने के लिए, आइए देखें कि एक्सएमएल 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पैरामीटर के रूप में स्वीकार करता है।