عناصر GUI  یا همون عناصری که از اونها در طراحی رابط کاربری مون استفاده میکنیم مشتق شده از کلاس View هستند
عناصر GUI مثل (Button و TextView و …) از نوع View می باشند ، بعبارتی این عناصر زیر کلاسی از یک کلاس مشترک به نام ( android.view.View ) یا به اختصار کلاس ( View ) هستند.

لیوت ها (RelativeLayout و LinearLayout و … ) نوع خاصی از View می باشند که ViewGroup نامیده می شود . ViewGroup نوع خاصی از view هست که توانایی نگه داری سایر View ها را دارا  می باشد.

همون طور که می دونید ما Viewهایمختلفی از قبیل (Button ها و Text View ها و Edit Text ها و …) رو درون لیوت ایجاد میکنیم.
و طبق آنچه ذکر شد منطق و عملکرد برنامه رو در اکتیوتی  مشخص می کنیم .
Activity و Layout
سوال ؟  کدهای اکتیوتی و کدهای لیوت( که در اصل کدهای ویووهامون رو در لیوت قرار میدیم)در  دو فایل جدا نگهداری می شوند پس چجوری از داخل اکتیویتی می تونیم  به Viewهای قرار داده شده در لیوت دسترسی داشته باشیم و اطلاعات اون ها رو دریافت و یا تغییرات لازم رو روشون اعمال کنیم ؟
پاسخ :با استفاده از تابع ()findViewById

تابع ()findViewById

این تابع id یک view موجود در لیوت که می خواهیم در اکتیوتی به اون دسترسی داشته باشیم رو دریافت کرده و یک شیء جاوایی از نوع View رو برای ما بر می گردونه .(از این بعد با View برگشت داده شده کار داریم)
ساختار دستور findViewbyid :

در دستور بالا بجای (Your_view_id) ،  id متعلق به View مورد نظرمون در لیوت رو وارد می کنیم.( id مربوط به view باید حتما  بلافاصله بعد از نوشتن عبارت ( .R.id) قرار گیرد.)
مثال : فرض کیند ما در لیوت یک View نوع Button داریم که id اون برابر btnSend است.کدهای کامل Button رو در زیر مشاهده میکنید:

برای دسترسی به این Button در اکتیویتی ، دستور findViewById رو به صورت زیر استفاده می کنیم.(البته یکم دیگه کار داریم)

دستور بالا در فایل لیوت میگرده و view ای که id اون btnSend هست رو پیدا کرده و در نهایت یک شی جاوایی از نوع view رو برمیگردونه.
شئ برگشت داده شده یک شی از نوع View است.تنها کاری که باید بکنیم اینه که این شیء رو به شئ متناظر با اونچه در لیوت است (Button) تبدیل کنیم.یعنی اگر view موجود در لیوت ما از نوع button است باید شیء View برگشت داده شده توسط متد findviewbyid رو بهمین نوع یعنی Button تبدیل (Cast)کنیم.
در نهایت با تعریف یک شیء جدید شئ برگشت داده شده رو ذخیره میکنیم.
در ذیل شکل کامل استفاده از دستور findeviewByid رو مشاهده می کنید :

همان طور که در بالا میبینید شی برگشت داده شده از نوع View را بوسیله نوشتن (Button) در پشت تابع findViewById ، به شی ای از نوع Button تبدیل کردیم.در سمت چپ هم یک شئ جدید از نوع Button ایجاد کردیم که شئ برگشت داده شده در طرف راست انتساب (=) را در خود ذخیره میکند.از الان به بعد می تونیم به وسیله شئ Mybutton و فراخوانی متدهای دلخواه روی اون هر بلایی رو که خواستیم رو از داخل سند اکتیوتی روی المنت Button موجود در لیوت بیاریم.

برای مثال یک اپلیکیشن کوچک می سازیم
نام اپلیکیشن : manoandroid.com
نام دامین اپلیکیشن :apk.manoandroid.com
سطح API اپلیکیشن : ۱۵
نوع اکتیوتی : Empty activity
نام اکتیوتی : پیش فرض باقی بگذارید (MainActivity.java)
نام لیوت : پیش فرض باقی بگذارید. (activity_main.xml)

حال ما به یک Button و یک TextView نیاز داریم .کدهای زیر را جایگزین کدهای قبلی کنید :

همان طور که می بینید id مربوط به Button رو برابر btnHello و id مربوط به TextView رو برابر txtMonitor قرار داده ایم.
می خواهیم موقعی که کاربر بر روی دکمه کلیک کرد (دکمه رو لمس کرد) متن “سلام ” بر روی المنت TextView نمایش داده شود.
برای این کار باید یک تابع درون اکتیویتی ایجاد کنیم و نام آن را به خاصیت onclick دکمه انتساب دهیم.بدین صورت موقعی که کاربر دکمه را لمس کرد بلافاصله تابع نوشته شده اجرا خواهد شد.نام این تابع را “SaySalam”می گذاریم.

برای این که یک تابع بتواند توسط خاصیت onClick اجرا شود باید سه خاصیت زیر را داشته باشد :
۱-نوع برگشتی آت void باشد.
۲-سطح دسترسی آن Public باشد.
۳-یک پارامتر از نوع View را دریافت کند.
با توجه به نکات بالا تابع SaySalam  را مطابق زیر می نویسیم :

کدهای زیر مربوط به سند اکتیوتی بهمراه تعریف تابع saySalam می باشند:

توضیح کدهای بالا
خط ۱ : نام پکیج اپلیکیشن ما می باشد.
خطوط ۳ تا ۷ : مربط به ایمپورت کلاس ها و کتابخانه مورد نیاز می باشد.(خط ۵ با زدن کلید ALT + Enter بطور خودکار نوشته شد)
خط ۱۱ : در این خط تابع saySalam را تعریف کرده ایم .(همان طور که می بینید نوع بازگشتی این تابع Void و سطح دسترسی اون Public می باشد .همچنین یک پارامتر از نوع View دارد .)
خط ۱۲ : در این خط توسط دستورfindViewById(R.id.txtMonitor) المنت TextView موجود در لیوت را پیدا کرده ایم.این تابع یک شئ View را برمیگرداند پس توسط قرار دادن (TextView) قبل از این تابع، شیء View برگشت داده شده را به نوع TextView تبدیل (Cast)کرده ایم.در سمت چپ انتساب هم یک شی جدید از نوع TextView با نام txtMonitor ایجاد کرده ایم که شی تبدیل شده را در خودش نگه میدارد.از این متدهای دلخواهمون رو روی این شئ صدا میزنیم.
خط ۱۳ : در این خط متد setText را روی شیء txtMonitor صدا زده ایم.این متد یک متن رو میگیره و اون رو برای خاصیت Text المنت مربوط به شئ ما (در اینجا txtMonitor) تنظیم میکنه.
حال باید نام این تابع را به خاصیت onClick دکمه موجود در لیوت بدهیم تا موقعی که کاربر دکمه رو لمس کرد ین تابع اجرا بشه و متن ” سلام ” روی TextView نمایش داده بشه.


به ازای هر المنتی که ما می تونیم در xml ایجاد کنیم یک نوع آبجکت جاوایی  متناظر با آن در اکتویتی قرار داده شده است .به جدول زیر دقت کنید:

کلمه کلیدی تعریف View مورد نظر در لیوت کلمه کلیدی تعریف آبجکت متناظر با آن View در اکتیوتی
EditText  EditText
 Button  Button
 TextView  TextView
 Spinner  Spinner
 RadioButton  RadioButton
 و …  و …

همان طور که می بینید عبارات تعریف یک View در لیوت با تعریف آبجکت معادل آن در اکتیوتی عیناً برابر هستند .!
حال اگر ما  می خواستیم توسط  متد findViewById به یک Button موجود در لیوت دسترسی داشته باشیم باید View بازگشت داده شده  رو به نوع Button تبدیل می کردیم.

در زیر لیست متد هایی که میتوانیم روی اشیائی که به المنت های ما متصل هستند فراخوانی کنیم رو مشاهده می کنید .

متدی که میتوانیم فاخوانی کنیم خاصیتی که توسط این متد تحت تاصیر قرار گرفته می شود ویژگی خاصیت
setText  text این خاصیت متن نمایشی روی View (المنت) را مشخص می کند.
 setTextColor  TextColor این خاصیت رنگ متن View رو مشخص می کند.
 setHint  Hint این خاصیت یک متن راهنما به صورتی که وقتی روی امنت کیک شد حذف شود تعریف می کند.
 setTextSize  TextSize این خاصیت اندازه متن View را مشخص می کند.
 setId  id توسط این خاصیت یک id (شماره شناسایی منحصر به فرد) برای View مشخص میکنیم.
 و …  و …

 

هر گونه سوال یا پیشنهادی داشتید رو میتونید از طریق بخش نظرات با ما در میان بگذارید.
من و اندرویدی باشید …