اولین برنامهی Xamarin:
پروژهی جدیدی را در ویژوال استودیو از نوع Android(Blank) Project ایجاد نمایید. اگر در حال حاضر برنامه را اجرا نمایید، ویژوال استودیو شبیه ساز مورد نظر را اجرا میکند و بعد از آن Package برنامهی شما را ساخته و برنامه را در شبیه ساز اجرا میکند (ما
در قسمت قبل Xamarin Android Player را معرفی کردیم).
بیایید یک نگاهی به Solution برنامه بیندازیم. برنامه از یک پروژه تشکیل شده است. پروژه شامل بخشهای مختلفی میباشد.
یکی از بخشهای مهم آن، Properties میباشد که شامل چندین بخش میشود. قسمت Application در قسمت اول توضیح داده شد. قسمتهای دیگر هم به مرور بررسی میشوند.
فولدر Asset میتواند شامل فایلها، فونتها و هر چیزی که برنامهی ما احتیاج دارد باشد (حتی دیتابیس).
فولدر Resource که در زیر مجموعهی آن:
- فولدر drawable وجود دارد که حاوی آیکنها و تصاویر و همچنین استایلهای ما میباشد.
- فولدر layout که طرح های(layout) برنامه را شامل میشود.
- فولدر value که شامل مجموعهای از فایلهای XML میباشد که میتواند شامل stringها، colorها و مقادیر عددی ثابت باشد.
- فولدر menu که منوهای برنامه را در خود جای داده است.
و البته منابع(Resources) دیگری که به صورت پیش فرض تعبیه شدهاند و میتوان از آنها استفاده کرد مانند: anim، animator، color، raw، xml.
Resourceها مزایای زیادی برای ما دارند! کدهای برنامه را از تصاویر، متنها، آیکنها، منوها و انیمیشنها و ... جدا میکند و به راحتی پشتیبانی از تنظیمات مختلف دستگاهها را برای ما فراهم مینماید. برای مثال بدون نیاز به کدنویسی میتوانید با دستگاههای مختلفی از لحاظ سایز و Local و ... ارتباط برقرار نمایید.
Resourceها به صورت static در اختیار کدهای برنامه قرار میگیرند و در زمان کامپایل چک میشوند و احتیاجی به اجرای برنامه برای اطمینان از صحت آنها وجود ندارد.
فایل Resource.Designer.cs که برای دسترسی از طریق کد به منابع تعبیه شده و به ازای هر یک از منابع مقداری را از طریق پروپرتیهای static در اختیار ما قرار میدهد. شما به هیچ وجه آن را تغییر ندهید؛ اما اجازهی مشاهدهی کلاس را دارید!
public partial class Resource {
public partial class Attribute
{
}
public partial class Drawable {
public const int Icon=0x7f020000;
}
public partial class Id
{
public const int Textview=0x7f050000;
}
public partial class Layout
{
public const int Main=0x7f030000;
}
public partial class String
{
public const int App_Name=0x7f040001;
public const int Hello=0x7f040000;
}
}
نحوهی استفاده از Resourceها در کد به این صورت میباشد:
@[<PackageName>.]Resource.<ResourceType>.<ResourceName>
که از سمت چپ به ترتیب شامل:
- نام Package که برای منابع پروژهی جاری نیازی به ذکر آن نیست.
- Resource که همیشه قید میشود.
- <ResourceType> نوع منبع را مشخص میکند و میتواند Id، String، Color، Layout،Drawable و ... باشد.
- <ResourceName> نام منبع را مشخص مینماید.
برای استفادهی از منابع در XML به صورت زیر عمل میکنیم:
@[<PackageName>:]<ResourceType>/<ResourceName>
به سلوشن برمیگردیم و به سراغ کلاسهای Activity میرویم.
Activityها اساس ساختمان برنامههای اندرویدی میباشند و در واقع Screenهای ما هستند و در طول عمرشان (از ایجاد تا تخریب) شامل حالتهای زیادی میباشند. نحوهی اجرای برنامهها در اندروید بسیار متفاوت است با برنامههای رایج. معمولا برای شروع یک برنامه، تابعی static با نام main وجود دارد که نقطهی شروع برنامه میباشد. در اندروید هر کلاسی میتواند به عنوان نقطهی شروع برنامه باشد. البته فقط یک Activity میتواند شروع کننده باشد. اما اگر برنامه crash کند و یا توسط اندروید متوقف شود، سیستم عامل نیز میتواند از همان نقطهی توقف و یا هر نقطهی دیگری برنامه را دوباره اجرا نماید.
Activityها برای هر حالت دارای یک متد هستند و به اندروید کمک میکنند تا Activityهایی را که زمان زیادی مورد استفاده قرار نگرفتهاند، تشخیص داده و حافظه و منابع را مدیریت کند. در شکل زیر حالتهای مختلف یک Activity را میتوانید مشاهده نمایید.
برای مدیریت این حالتها برای Activityها، متدهایی نیز تعبیه شدهاست که ما با استفاده از آنها میتوانیم در هر حالتی از Activity، تصمیمات لازم را اتخاذ کنیم. برای استفاده از این متدها شما باید آنها را داخل Activity خود override نمایید. متدهای موجود به قرار زیر است:
OnCreate: اولین متدی میباشد که موقع ایجاد Activity فراخوانی میشود. این متد همیشه برای مقداردهی اولیه override میشود. شما میتوانید برای ساخت ویوها، مقداردهی متغیرها و همچنین مقداردهی لیستها از آن استفاده نمایید. آرگومان ورودی این متد (bundle) از نوع کلاس Bundle میباشد و در صورتی که null نباشد، یعنی برنامه Restart شده (با توجه به تصویر حالتهای مختلف Activity) و اگر null باشد، یعنی برنامه شروع به کار نموده است. از این bundle که در واقع یک دیکشنری است میتوان برای نگهداری حالتهای برنامه استفاده نمود.
OnStart: همیشه بعد از OnCreate اجرا میشود و برای انجام کارهایی که لازم داریم قبل از نمایش Activity به کاربر مورد استفاده قرار میگیرد.
OnResume: بعد از نمایش Activity به کاربر این متد اجرا میشود. از این متد میتوان برای اجرای انیمیشنها، گوش دادن به بروزرسانیهای GPS، نمایش پیغام و ... در ابتدای نمایش Activity استفاده کرد.
OnPause: این متد موقعی اجرا میشود که برنامه به Background برود. شما اگر میخواهید کارهایی مانند:
- آزادسازی منابع
- بستن دیالوگهای باز شده!
- ذخیره سازی اطلاعات تایید نشده
- توقف انیمیشنها و ...
را انجام دهید باید این متد را override نمایید. نکتهی مهم این است که یکی از دو متد OnResume و OnStop امکان دارد بعد از این متد اجرا شوند (به همین دلیل یکی از مهمترین متدهای برنامه، OnResume میباشد).
OnStop: زمانیکه یک Activity، دیگر به کاربر نمایش داده نمیشود، این متد اجرا میشود و در یکی از حالتها زیر این اتفاق میافتد:
- یک Activity جدید اجرا شود.
- فعالیت یک Activity که قبلا اجرا شده، ادامه پیدا کند.
- برنامه متوقف گردد.
ممکن است در بعضی مواقع به دلیل کمبود حافظه این متد اجرا نشود.
OnDestroy: زمانی که برنامه کاملا از حافظه پاک شود، این متد اجرا میگردد.
OnRestart: این متد بعد از Stop شدن یک Activity و قبل از Start دوبارهی آن اجرا میشود.
خوب! به سراغ متد OnCreate داخل Activity که به صورت اتوماتیک ایجاد شده میرویم. در جاوا باید تمام Activityها را در Manifest معرفی نماییم و نقطهی شروع را مشخص کنیم. اما همیشه در سی شارپ کار برای ما راحتتر بوده است! نحوهی کار به این صورت است که با اجرای برنامهی ما، آن کلاسی که از Activity ارث برده باشد و با ActivityAttribute با مقدار ورودی MainLauncher = true مزین شده باشد، اجرا میشود.
با استفاده از SetContentView میتوانیم یک ویو (View) را برای نحوهی نمایش Activity مشخص کنیم و باید از قبل ویو را در پوشهی Layout ساخته باشیم که البته این کار بصورت اتوماتیک انجام شده است.