উদাহরণস্বরূপ অভ্যন্তরীণভাবে কল করার ক্ষেত্রে android:onClickঅ্যাট্রিবিউট ফলাফলগুলি নির্দিষ্ট করে । সুতরাং একেবারে কোনও পার্থক্য নেই।ButtonsetOnClickListener
পরিষ্কার বোঝার জন্য, আসুন দেখুন কীভাবে এক্সএমএল onClickবৈশিষ্ট্যটি ফ্রেমওয়ার্ক দ্বারা পরিচালনা করা হয়।
যখন কোনও বিন্যাসের ফাইলটি স্ফীত হয়, এতে উল্লিখিত সমস্ত দর্শন তাত্ক্ষণিকভাবে শুরু করা হয়। এই নির্দিষ্ট ক্ষেত্রে, Buttonউদাহরণটি public Button (Context context, AttributeSet attrs, int defStyle)কনস্ট্রাক্টর ব্যবহার করে তৈরি করা হয় । এক্সএমএল ট্যাগের সমস্ত বৈশিষ্ট্য রিসোর্স বান্ডেল থেকে পড়ে এবং AttributeSetকনস্ট্রাক্টর হিসাবে পাস করা হয়।
Buttonক্লাসটি ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় Viewযার ফলশ্রুতিতে Viewকনস্ট্রাক্টর ডেকে আনা হয়, যা ক্লিক কল ব্যাক হ্যান্ডলারের মাধ্যমে সেট করার যত্ন নেয় setOnClickListener।
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ব্যতিক্রম পরিচালনা করতে প্রস্তুত ।
- অবিচ্ছিন্ন বাটন ক্লিক করে ফ্রেগমেন্টে, কলব্যাকটি ক্রিয়াকলাপে সংজ্ঞায়িত করা উচিত :
getContext().getClass().getMethod()কলটি বর্তমান অনুসন্ধানে পদ্ধতি অনুসন্ধান সীমাবদ্ধ করে, যা খণ্ডের ক্ষেত্রে ক্রিয়াকলাপ। অতএব পদ্ধতিটি ক্রিয়াকলাপ শ্রেণীর মধ্যে অনুসন্ধান করা হয় না খণ্ড শ্রেণীর মধ্যে।
- কলব্যাক পদ্ধতিটি প্যারামিটারটি গ্রহণ করা উচিত : যেহেতু প্যারামিটার হিসাবে
Java Class getMethodগ্রহণযোগ্য পদ্ধতির সন্ধান করে View.class।