PDA

View Full Version : رابطه کلاس View با اینترفیس OnClickListener



ho1377
جمعه 23 تیر 1396, 13:24 عصر
سلام کد زیر رو در نظر بگیرید

mFalseButton.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(QuezActivity.this,R.string.incorrec t_toast,Toast.LENGTH_SHORT).show();
}
});

چرا ارجاع به اینترفیس OnClickListener اینطوری نوشته شده : View.OnClickListener ؟ اصلا OnClickListener چه رابطه ای با کلاس View داره که دستور ارجاع اینطوری نوشته شده؟

Nevercom
جمعه 23 تیر 1396, 16:10 عصر
چرا ارجاع به اینترفیس OnClickListener اینطوری نوشته شده : View.OnClickListener ؟

به این دلیل که اینترفیس OnClickListener در کلاس View تعریف شده و عملاً جزئی از این کلاس محسوب میشه.


اصلا OnClickListener چه رابطه ای با کلاس View داره که دستور ارجاع اینطوری نوشته شده؟

این اینترفیس به جهت نیازی که برای Widgetها وجود داشته نوشته شده، درواقع این اینترفیس و چند اینترفیس دیگه Callbackی هستند برای رویداد های مختلفی که این عناصر UI (که بهشون میگیم Widget) باید بهش واکنش نشون بدن. همونطور که می دونید همه ی Widget ها از کلاس View مشتق شدن و نتیجه این هستن که این رویداد ها برای همه ی Widget ها مشترک هست.

تا اینجا مشخص هست که این اینترفیس مخصوص کلاس View و Subclassهای اون هست و حتی متد onClick این اینترفیس هم ورودی ای از جنس View میگیره، پس این یک اینترفیس کلی و همه منظوره نیست و کاربردش مختص همین کلاس هست، پس منطقی بنظر میرسه که جزئی از این کلاس باشه.

اگر سوال این هست که: از بعد فنی آیا باید این اینترفیس در این کلاس تعریف بشه یا میتونه در پکیج دیگری و در فایلی مجزا باشه ؟ پاسخ این هست که خیر، الزامی وجود نداره و در هر دو صورت، نتیجه‌ی نهایی یکسان هست.
من خودم در پروژه هام همهی اینترفیس ها رو در پکیجی با نام interfaces قرار میدم، اما وقتی قراره شما یک Framework و APIی برای اون طراحی کنید، باید این موضوع رو درنظر بگیرید که این پروژه میتونه خیلی بزرگ بشه پس باید نظم و منطقی در ساختار درونی اون حاکم باشه تا علاوه بر اینکه یک پیوستگی کلی در کل پروژه حاکم باشه، هم تیمی ها هم بتون خیلی راحت تر در روند توسعه کمک کنن (بخصوص پروژه های اوپن سورس)

علاوه بر این چون دیگران قراره به واسطه ی API از فریم وورک شما استفاده کنن، پس باید همین پیوستگی و نظم و منطق رو API حاکم کنید تا توسعه دهنده خیلی راحت تر بتونن با فریم وورک ارتباط برقرار کنن.

ho1377
جمعه 23 تیر 1396, 18:19 عصر
به این دلیل که اینترفیس OnClickListener در کلاس View تعریف شده و عملاً جزئی از این کلاس محسوب میشه.



این اینترفیس به جهت نیازی که برای Widgetها وجود داشته نوشته شده، درواقع این اینترفیس و چند اینترفیس دیگه Callbackی هستند برای رویداد های مختلفی که این عناصر UI (که بهشون میگیم Widget) باید بهش واکنش نشون بدن. همونطور که می دونید همه ی Widget ها از کلاس View مشتق شدن و نتیجه این هستن که این رویداد ها برای همه ی Widget ها مشترک هست.

تا اینجا مشخص هست که این اینترفیس مخصوص کلاس View و Subclassهای اون هست و حتی متد onClick این اینترفیس هم ورودی ای از جنس View میگیره، پس این یک اینترفیس کلی و همه منظوره نیست و کاربردش مختص همین کلاس هست، پس منطقی بنظر میرسه که جزئی از این کلاس باشه.

اگر سوال این هست که: از بعد فنی آیا باید این اینترفیس در این کلاس تعریف بشه یا میتونه در پکیج دیگری و در فایلی مجزا باشه ؟ پاسخ این هست که خیر، الزامی وجود نداره و در هر دو صورت، نتیجه‌ی نهایی یکسان هست.
من خودم در پروژه هام همهی اینترفیس ها رو در پکیجی با نام interfaces قرار میدم، اما وقتی قراره شما یک Framework و APIی برای اون طراحی کنید، باید این موضوع رو درنظر بگیرید که این پروژه میتونه خیلی بزرگ بشه پس باید نظم و منطقی در ساختار درونی اون حاکم باشه تا علاوه بر اینکه یک پیوستگی کلی در کل پروژه حاکم باشه، هم تیمی ها هم بتون خیلی راحت تر در روند توسعه کمک کنن (بخصوص پروژه های اوپن سورس)

علاوه بر این چون دیگران قراره به واسطه ی API از فریم وورک شما استفاده کنن، پس باید همین پیوستگی و نظم و منطق رو API حاکم کنید تا توسعه دهنده خیلی راحت تر بتونن با فریم وورک ارتباط برقرار کنن.

ممنون واقعا جواب سوالم رو گرفتم.
پس میشه گفت همون طور که inner class داریم inner interface هم داریم؟ اینترفیس رو جدا از کلاس هم میشه نوشت؟

Nevercom
شنبه 24 تیر 1396, 11:56 صبح
اینترفیس رو جدا از کلاس هم میشه نوشت؟

آره، File > New > Java Class رو انتخاب کن، تو دایالوگ باز شده، Kind رو Interface انتخاب کن.