عنوان:

‫برنامه نویسی اندروید با Xamarin.Android - قسمت دوم


نویسنده: محسن دلاوری
تاریخ: ۱۳۹۴/۱۰/۲۸ ۹:۵۵
آدرس: www.dntips.ir
اولین برنامه‌ی 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 ساخته باشیم که البته این کار بصورت اتوماتیک انجام شده است.

نظرات

  • مهدی ملائیان در ۱۳۹۴/۱۰/۲۸ ۱۱:۱۱
    با تشکر.کلیه رفرنس‌های برنامه من خطا میده.اگر میشه راهنمایی بفرمائید.

    • محسن دلاوری در ۱۳۹۴/۱۰/۲۸ ۱۱:۵۷
      بررسی کنید آیا مراحل نصب Xamarin  را به طور کامل انجام داده اید یا نه!
      • مهدی ملائیان در ۱۳۹۴/۱۰/۲۸ ۱۷:۹
        تمامی مراحل رو چک کردم .ممنون میشم اگر کسی بطور کامل تونسته زامارین رو راه اندازی کنه یه آموزش تصویری برای بقیه از مراحل راه اندازی قرار بده.
  • توکلی در ۱۳۹۴/۱۱/۰۳ ۱۶:۵۵
    سلام
    خیلی ممنون از آموزشتون ، من مرحله به مرحله با آموزش شما همراه هستم تا بتونم اولین برنامه اندرویدی خودم رو تولید کنم.
    1- مشکلی که من دارم اینه که برنامه رو نوشتم و بدون خطا اجرا میشه ولی موقع اجرا صفحه خالی اندروید میاد و چیزی از برنامه من توش نیست یعنی گوشی خالی
    2- سوالی که داشتم اینه آیا راه راحتتری برای استفاده از کنترل‌ها به صورت ویژوال وجود نداره ؟ مثلا تولباری چیزی
    • محسن دلاوری در ۱۳۹۴/۱۱/۰۴ ۱۶:۴
      1- مطمئن هستید که برنامه به درستی اجرا میشه؟! آیکون برنامه در بین برنامه‌های نصب شده وجود دارد؟ SetContentView را به درستی ست کرده اید؟
      2- بله میتوانید از toolbar مخصوص که مانند برنامه‌های windows form هست استفاده کنید. Xamarin Stdio هم ابزار مناسبی هست. البته من خودم خیلی طراحی‌ها را در Android Studio انجام میدهم که Editorهای xml، خیلی بهتر کار میکند و بعد به ویژوال استادیو منتقلش میکنم.
      • توکلی در ۱۳۹۴/۱۱/۰۵ ۱۲:۳۰
        1- حل شد ، دفعه اول باید یه 10 دقیقه ای صبر کنیم تا ویژال استدیو بعضی api‌ها رو نصب کنه
        2- میشه این تولبار رو هم معرفی کنید چون تولید نرم افزار 2 تا فاز طراحی و برنامه نویسی داره که مرحله طراحی با این روش خیلی سخت به نظر می‌رسه
        باز هم ممنون
  • توکلی در ۱۳۹۴/۱۱/۰۷ ۱۶:۱۸
    من با xamarin studio دارم کار میکنم حالت content برای layout کار رو برای طراحی رابط کاربری خیلی آسون میکنه. مشکلی که من دارم اینه که موقع دسترسی به یه آبجکتی که تو یه layout دیگه هست خطای null دریافت می‌کنم ولی وقتی با دستور ((StartActivity (typeof(loginActivity اکتیویتی اون layout رو فعال میکنم میتونم دسترسی داشته باشم.
    یه سوال کلی اینکه ما برای طراحی کلیت برناممون باید برای هر صفحه یه layout طراحی کنیم و کد‌های اون رو تو activity اون بنویسیم؟  
    • محسن دلاوری در ۱۳۹۵/۰۳/۲۳ ۱۸:۱۷
      هر صفحه در اندروید یک اکتیویتی می‌باشد که میتوان کنترل‌های داخلی آن را توسط layoutها و یا با کدهای جاوا ایجاد کرد.