0

کلاس اموزش برنامه نویسی اندروید(دوره اول)

 
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

کلاس اموزش برنامه نویسی اندروید(دوره اول)

بنام خدا

مقدمه و توافق نامه:

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

♦ از آنجاییکه در زمان اندکی که در طول هفته دست می دهد، فرصتی برای نوشتن این سری آموزشها دارم، نواقص متعددی مشاهده خواهد شد و خوشحال خواهم شد که نواقص را از طریق ایمیل به من ارسال نمائید.

♦ در مورد ارسال نظرات خواهشمندم که از نوشتن نظرات جنجال برانگیز و جوساز جداً خودداری فرمائید. دوستانی که این مباحث برایشان جالب نیست یا احساسی خوبی از خواندن مطالب ندارند، لطفاً به این مطلب مراجعه نکنند تا باعث رنجش خود و سایرین نگردند.

♦ از آنجایی که حداقل انتظار از سطح علمی مخاطبان این مجموعه، برنامه نویسان متوسط حداقل آشنا به یکی از زبانهای شیء گرایی هستند، لذا خواهشمندم در صورتیکه مطلبی سنگینتر از دانش فعلی شما بود، با مطالعه مراجع و منابع نامبرده شده، سعی در افزایش دانش فنی خود نموده و از مطرح کردن سئوالات قابل مطالعه از اینترنت یا کتب تا جای ممکن پرهیز کنید.

 مسلم است که برنامه نویسی اندروید، فقط با مطالعه این مطالب ممکن نخواهد بود و به مطالعه آزاد و گسترده خود شما نیازمند است. همینطور علاقه، انگیزه، پشتکار و سرعت عمل می تواند مسیر را برای شما شیرینتر و ساده تر کند. صرف زمان حدود 6 ساعت در روز برای علاقه مندان توصیه می شود و در شرایطی وقت آزاد دارید، مطالعه و تمرین حتی تا 13 ساعت در طول شبانه روز ممکن خواهد بود ( البته کم کم باید به ذهن و بدن خود عادت بدهید و یکباره ساعت کار خود را افزایش ندهید ).

♦ همیشه به این موضوع توجه داشته باشید که تلاش هوشمندانه در زمان کوتاه بسیار بسیار مفیدتر از تلاش کورکورانه در زمان طولانیست. لذا مسیر حرکت خود را صحیح و بدون شتابزدگی انتخاب نمایید.

♦  این مطالب برای نویسنده مطلب محفوظ بوده. عدم رعایت حقوق نویسنده، خلاف اصول اخلاقی و حرفه ای می باشد.

دوستانی که در دریافت برنامه ها مشکل دارند اطلاع دهند تا لینک اضافی برای دانلود قرار بگیرد
 از توجه شما به نکات فوق سپاسگزارم 

 

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

پنج شنبه 2 بهمن 1393  2:30 AM
تشکرات از این پست
tachberdee nezarat_ravabet ravabet_rasekhoon
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

روش مطالعه:

روش مطالعه صحیح دوره آموزشی اندروید، جهت کسب بیشترین بازدهی در حداقل زمان، در قالب نکاتی در زیر درج شده. لذا جهت سهولت کار خود سعی کنید که این نکات را در مطالعه آموزشها در نظر بگیرید.

♦ هر دوره آموزشی را در چندین مرور بخوانید.

- بار اول سریع و بدون توجه به جزئیات مطالعه کنید. کدها و تصاویر را خیلی سطحی نگاه کنید، نیاز نیست آنها را در برنامه بنویسید و آزمایش کنید، فقط نگاه کنید و بدنبال علل و چگونگی نوشتار نباشید. در این مرحله اگر 10% از کل مطلب را متوجه شوید کفایت می کند.
- بار دوم، دقیقتر به مطالب توجه کنید. از لینک های کمکی که با * مشخص شده اند جهت کسب راهنمایی بیشتر استفاده کنید. باز هم نیاز به نوشتن کدها و برنامه نیست اما با دقت بیشتری کدها را بررسی کنید و سعی کنید عملکرد کدها را حدث بزنید. در این بار مرور اگر 20% دیگر از مطالب را متوجه شوید کفایت می کند.
- بار سوم، دقیقتر از بار دوم مطالب را مطالعه کنید. در این مرحله با نوشتن بعضی نکات، رسم نمودارها، رسم چارت های مطالعه و ... می تواند کمک بیشتری به شما بکند. کدها را بنویسید و بررسی کنید اما نه خیلی دقیق بلکه سطحی. در این بار مرور اگر 20% دیگر مطالب برای شما آشکار شود کفایت می کند.
- بار چهارم، سعی کنید مطالب را با کدهای نوشته شده تطبیق دهید و هر تعریف تئوری را در کد پیدا کنید و کاربرد آنرا ببینید. در این مرحله انتظار می رود حدود 80% از کل مطلب را دریافته باشید. این مرحله می تواند بیشترین زمان را از شما بگیرد.
- بار پنجم، به توصیه ها عمل کرده تا بتوانید 100% مطالب بیان شده را بکار ببرید. سرعت اتمام این مرحله به تمرین و توانایی های قبلی شما بستگی دارد و شاید کوتاهتر از مرحله چهارم باشد، شاید هم بیشتر از مرحله چهارم به طول انجامد ولی سعی کنید به تمام توصیه های نوشته شده در انتهای مطلب عمل کنید.

♦ پیشنهاد می شود هر روز بیش از 6 ساعت برای برنامه نویسی وقت بگذارید.

♦ تا جاییکه می توانید از مطالب انگلیسی استفاده کنید. اگر در مطالعه انگلیسی ضعفی دارید با نصب یک دیکشنری کمک بگیرید. توجه داشته باشید که پیشرفت شما در گرو توانایی متون انگلیسی موجود در اینترنت خواهد بود.

♦ هر دوره به طور معمول حدود 3 تا 7 روز نیاز به کار دارد و بستگی به ساعتی است که در روز صرف انجام تمرینات و مرور ها می نمایید.

♦ از لینک های * دار در حدی استفاده نمایید که فقط بدانید چیست و در صورت داشتن وقت بیشتر آنرا بیشتر مطالعه کنید.

♦ به توصیه های پایین هر مطلب آموزشی توجه داشته باشید. به عبارتی این توصیه ها ، تمریناتی هستند که به شما در تکمیل جلسه فعلی و پیشروی بیشتر در جلسات آینده کمک زیادی خواهند کرد.

♦ در یادگیری عجله نداشته باشید و سعی کنید با خونسردی و رعایت نکات فوق مطالب را یک به یک یاد بگیرید.

♦ مطالب را به دلخواه خود، رد نکنید و آنها را به ترتیب بخوانید، مگر اینکه در مطلبی ذکر شده باشد که مطالعه آن دلخواه است.

♦ جلسه اول آموزش دارای تعداد زیادی از اصطلاحات و واژه های معمولاً نا آشناست. بیشتر وقت شما در این جلسه صرف فهمیدن این واژه ها می شود که جهت ادامه کار به شما کمک زیادی خواهد کرد. بدانید که این واژه ها در بین برنامه نویس ها مصطلح است و دانستن آن در آینده ضروری خواهد بود و در اوایل کار کمک کننده.

♦ کتاب خاصی برای مطالعات اضافه پیشنهاد نمی شود و اکیداً توصیه می شود که خود را به یک کتاب محدود نکنید. می توانید انواع کتب را از سایتهایی که به طور غیر مجاز کتابهای غیر رایگان را برای دانلود می گذارند دانلود کنید و هر بار که در مورد مطلبی سئوال دارید به سرفصل اکثر آنها مراجعه و بهترین گزینه را برای مطالعه انتخاب کنید. هیچ کتابی در ارائه همه مطالب قوی نیست و هر کدام برای زمان و شرایط خاصی مناسب هستند. اما توصیه بهتر اینست که سئوالات خود را مستقیماً از گوگل درخواست کنید. با یک search keyword مناسب در گوگل بسیار بسیار سریعتر به مطالب آموزشی دست پیدا خواهید کرد.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

پنج شنبه 2 بهمن 1393  2:31 AM
تشکرات از این پست
tachberdee nezarat_ravabet
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

سرفصل ها

 

ردیف 

عنوان کلید واژه
1 مقدمه و توافق نامه -
2 روش مطالعه -
3 فهرست و سرفصل -
4 اخبار و تغییرات آموزشی -
5 آماده کردن محیط برنامه نویسی نصب و تنظیم Eclipse
6 ساخت و اجرای اولین پروژه ساخت پروژه - ساخت امولاتور - ساختار پروژه
7 استفاده از UI - مقدماتی 1 آشنایی به xml فرمهای جاوا - اتصال UI Resource به Pointer در جاوا
8 برنامه نویسی جاوا - مقدماتی 1 متغیرها ( Primitive ) - قالب های دستوری - ساختار متد
9 شیء گرایی در جاوا - مقدماتی 1 مفهوم شیء گرایی - فیلدها و متدها - Constructor - دید - ساخت نمونه کلاس
10 شیء گرایی در جاوا - مقدماتی 2 ثابت ها - Modifier ها - this - استفاده از static
11 شیء گرایی در جاوا - مقدماتی 3 میراث بری - Override و همپوشانی - تعریف Nested Class ها
12 برنامه نویسی جاوا - مقدماتی 2 استفاده از array ها - استفاده از ArrayList ها - چند الگوریتم معروف
13 پروژه « تبدیل واحد » - ساخت UI مقدمات xml - ساخت UI مقدماتی
14 پروژه « تبدیل واحد » - برنامه نویسی تعریف چند فرم - جابجایی بین فرم ها - تبدیل واحد ها
15 همزمانی - مقدمات مقدمات Process ، Thread ، Stack - حلقه اصلی برنامه ، Main Thread
16 همزمانی - Thread ها تعریف Thread و Runnable - شروع ، توقف و خاتمه Thread - استفاده از Handler
17 همزمانی - AsyncTask ها تعریف AsyncTask - استفاده از Callback ها
18 پروژه « شمارنده » یک پروژه با هدف بکارگیری Thread ها بصورت کامل
19 قوائد نوشتار برنامه نام گذاری منابع، متغیرها، کلاسهاو سایر - نحوه پیرایش کد - استانداردها
20 استفاده از ListView ها و UI سطح متوسط      طراحی Adapter - استفاده از ListView ها - کاربرد xml drawable ها و دیالوگ ها

 

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

پنج شنبه 2 بهمن 1393  2:35 AM
تشکرات از این پست
tachberdee
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

مقدمه:

برنامه نویسی اندروید Android * با دو زبان برنامه نویسی ممکن است،

1- جاوا * ( که مد نظر ما در طول این آموزشهاست )
2- ++C ( یا همان NDK * ) که بطور خیلی خاص در برنامه های با پردازش بالا استفاده می شود و در این آموزشها به آن کاری نخواهیم داشت.
همانطور که Java به زبان میانی IL - Intermediate Language * * ( تبدیل می شود ) و توسط JVM - Java Virtual Machine * بر روی دستگاه مقصد اجرا می شود، برنامه های اندروید نیز توسط Dalvik Virtual Machine * بر روی دستگاه موبایل یا Tablet *مقصد اجرا می شوند. وظیفه Dalvik اتصال توابع خاص اندروید، Optimize * کردن برنامه برای بهینه نمودن آن مطابق با حافظه و منابع دستگاه مقصد و در نهایت انجام کامپایل نهایی مشابه عملی که JVM انجام می باشد.




نرم افزار های مورد نیاز برای توسعه نرم افزار مبتنی بر اندروید:

ویرایش: دوستان عزیز، لطفاً در صورتیکه بدون نصب نرم افزار های زیر، در آموزشهای بعدی با مشکل مواجه شدید، ابتدا به طریق گفته شده نرم افزارها را نصب و در صورت برطرف نشدن مشکل به طرح پرسش اقدام فرمائید.
مسلماً برای برنامه نویسی Java نیاز به JRE - Java Runtime Environment * و JDK - Java Development Kit * داریم. بسته به سیستم عامل انتخابی شما ( که در این آموزشها ویندوز خواهد بود ) ، چه برای ویندوزهای 32 بیت و چه 64 بیت از نسخه های 32 بیت استفاده کنید. به هیچ عنوان از ورژن 1.7 یا 7u1 جاوا استفاده نکنید چرا که در برخی موارد نظیر sign کردن نرم افزار دارای مشکلاتی است.
» لینک فایل 32 بیت JDK که JRE را هم در بر دارد ، با لینک مستقیم در زیر قرار گرفته است:

JDK:
http://31.7.56.44/fileshub/requireme...ndows-i586.exe


با نصب JRE و JDK پیش نیاز های ترجمه برنامه نوشته شده Java به Java IL نصب خواهد شد. اما برای نوشتن برنامه Java نیاز به یک IDE - Integrated Development Environment مناسب با امکانات بالا داریم. چه بهتر که این IDE رایگان، مورد اعتماد Google و open-source * باشد. بنابراین از Eclipse به عنوان IDE ( محیط برنامه نویسی ) جاوا استفاده خواهیم کرد.
» نسخه 32 بیتی این IDE در زیر ارائه شده است. نسخه classic این نرم افزار حدود 170 مگابایت * است و نسخه ای که برای دانلود قرار داده شده شامل plugin های لازم برای کار شماست از جمله ADT - Android Development Tools.

Eclipse :

 


» این نسخه بر روی ویندوز های 64 بیتی هم قابل اجرا خواهد بود. Eclipse نیاز به نصب ندارد، فقط کافیست آنرا در یک دایرکتوری باز کنید و فایل اجرایی آن را اجرا کنید. تنظیمات این IDE در قالب یک دایرکتوری به نام metadata ذخیره خواهد شد. با کپی این دایرکتوری و استفاده آن در کامپیوتر های دیگر قادر خواهید بود از تنظمیات خود مجدداً ( در کامپیوتر جدید تر ) استفاده کنید. برای راحتی کار، تنظیمات مورد نیاز eclipse و plugin های مربوطه شامل ( رنگ بندی های مناسب، کلیدهای shortcut مناسب، workspace مناسب و ... ) آماده شده که از مسیر زیر قابل دانلود است.

Metadata:

For Windows click here

For Mac click here

 


طریقه باز کردن Eclipse، metadata و ... در بخش بعدی بیان خواهد شد.
» همچنین نیاز به SDK * اندروید داریم. بدلیل ف ی ل ت ر شدن ip کشور ما در گوگل امکان دانلود آن در ایران وجود ندارد، با ف ی ل ت ر ش ک ن هم سرعت دانلود در حد 2 kbps است. برای راحتی کار، ورژنهای SDK مورد نیاز را دانلود کرده ام و بصورت لینک مستقیم در زیر قابل دانلود است. طریقه باز کردن آن در بخش بعدی توضیح داده خواهد شد.
 

Android SD

 مخصوص ویندوز
 

 ویندوز 32 بیتی
 برنامه اصلی - 356 مگابایت
 

 

برای نصب نرم افزار بایستی Java SE Runtime Environment بر روی سیستم شما نصب شده باشد،

    
    
 


نصب و راه اندازی:

» ابتدا با نصب JDK از شما سئوالی در مورد نصب JRE پرسیده می شود که تأیید کتید، بنابراین JRE و سپس JDK را نصب خواهید کرد.

» یک دایرکتوری در مسیر کوتاهی مانند c:\android یا d:\android بسازید. این مسیر از این پس در کل آموزش بنام DEV_ROOT شناخته خواهد شد. یعنی هر گاه داشتیم DEV_ROOT یعنی مسیر کوتاه انتخابی در این بخش. توجه کنید که نام دایرکتوری را تماما با حروف کوچک بنویسید و برای جدا کردن کلمات در نام دایرکتوری از _ استفاده کنید. بطور مثال c:\android_development . مسیر پیشنهادی c:\android خواهد بود.

» یک دایرکتوری بنام sdk در دایرکتوری DEV_ROOT بسیازید و فایل android.rar را در آن کپی کنید و آنرا با استفاده از Winrar با گزینه Extract Here باز کنید.

» یک دایرکتوری بنام workspace در دایرکتوری DEV_ROOT بسازید و metadata.rar را در آن کپی کنید و با استفاده از گزینه Extract Here نرم افزار Winrar آن را باز کنید

» فایل eclipse.rar را در دایرکتوری DEV_ROOT کپی کنید و با استفاده از Extract Here نرم افزار Winrar آنرا باز کنید.

در صورتیکه فرآیند Extract کردن را بدرستی رعایت کرده باشید باید ساختار دایرکتوری بشکل زیر داشته باشید:

 


» پس از باز شدن eclipse در دایرکتوری آن فایل eclipse.exe را اجرا کنید، پس از مدتی از شما مسیری می پرسد، در اینصورت مسیر DEV_ROOT\workspace را وارد کنید و تیک پایین پنجره را بزنید و OK کنید. توجه کنید که بجای DEV_ROOT مسیر اصلی مانند c:\android را جایگزین کنید. اگر این پنجره نیامد پس از باز شدن eclipse وارد منوی Window->Preferences شوید و از پنل چپ General->Startup and Shutdown->Workspaces را انتخاب کنید و تمام گزینه های داخل پنجره باز شده را Remove کنید. تیک اول را بزنید. Eclipse را ببندید و دوباره اجرا کنید. این بار حتما از شما مسیر را می پرسد.

» توجه : هیچ وقت بیشتر از یک eclipse باز نکنید. اگر چند eclipse باز شده دارید ابتدا همه را ببندید و دوباره یک eclipse باز کنید.

» پس از باز شدن eclipse وارد منوی Window->Preferences شوید و از پنل سمت چپ Android را انتخاب کنید. در قسمت SDK Location مسیر DEV_ROOT\sdk\android را انتخاب نمایید و OK بزنید.

» بهتر از یکبار ویندوز را restart کنید که مسیر JDK در Environment Variables ثبت شود.

» تمام، محیط برنامه نویسی شما آماده است.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

پنج شنبه 2 بهمن 1393  2:38 AM
تشکرات از این پست
tachberdee
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

آموزش:

در قسمت اول محیط برنامه نویسی ما آماده شد. در این قسمت قصد داریم اولین پروژه اندروید را تولید کنیم. طبق عرف این پروژه همان Hello World! است.
» وارد محیط eclipse شوید.
» با استفاده از Ctrl+N یا منوی File->New->Other پنجره ساخت فایل یا پروژه جدید باز می شود.
» مقابل Wizards: تایپ کنید Android تا گزینه های قابل ساخت مرتبط با اندروید ..... شوند.
» Android Project را از لیست انتخاب کنید و Next
» نام پروژه که لاتین است را در Project Name بنویسید. در این آموزش می نویسیم Test1 و بزنید Next
» از لیست گزینه ها Android 2.1 را انتخاب و بزنید Next
» در قسمت Package Name بنویسید com.uncocoder.course.test1 و بزنید Finish

خوب اولین پروژه ساخته شد. اما چگونه آنرا اجرا کنیم. ابتدا این پروژه را با استفاده از Emulator * اجرا خواهیم کرد. اجرای آن بر روی Device واقعی در صورتیکه درایور های Device نصب باشد بسیار ساده تر از اجرا بر روی Emulator خواهد بود. برای اجرای پروژه بر روی Emulator ابتدا نیاز به ساخت یک Virtual Device داریم بنابراین به طریقه زیر عمل می کنیم:
» از منوی Window->AVD Manager را انتخاب کنید
» کلید New را بزنید
» پنجره باز شده را به شکل زیر تصحیح کنید:



» دکمه Create AVD را بزنید.
» Device1 را از لیست انتخاب کنید
» دکمه Start را بزنید
» پنجره باز شده را به شکل زیر تنظیم کنید



» دکمه Launch را بزنید

» منتظر باشید تا Emulator به طور کامل بالا بیاید و بتوانید با استفاده از Mouse آنرا Slide To Unlock کنید. این فرآیند ممکن است کمی طول بکشد، اما برای بارهای بعد خیلی سریع Emulator بالا خواهد آمد.

» بدون اینکه Emulator را ببندید پنجره AVD Manager در Eclipse را ببندید. بنابراین Emulator از Windows Taskbar * قابل انتخاب خواهد بود.

» در محیط Eclipse در Package Explorer بر روی Test1 که دارای پوشه آبی رنگی است RightClick کنید و Run As را بزنید. از این منو Android Application را انتخاب کنید. بار های بعد برای اجرای پروژه کافیست از کلید F5 استفاده کنید.

» Emulator را از Windows Taskbar انتخاب کنید تا بر روی Eclipse بیاید و می توانید برنامه را ببینید که بصورت زیر است در آن ببینید.



» مادامی که مشغول برنامه نویسی هستید نیازی به بستن Emulator وجود ندارد. فقط با استفاده از کلید  که از این پس Back نامید می شود برنامه را ببندید.

» توجه داشته باشید در صورتیکه برنامه بسته نشده باشد و یا تغییری در آن ایجاد نشده باشد، اجرای مجدد آن با استفاده از کلید F5 یا Run As نتیجه ای در بر نخواهد داشت.

به اینکه این پروژه چگونه کار می کند در آموزشهای بعد پرداخته می شود اما در این قسمت قصد دارم که ساختار دایرکتوری موجود در پروژه را توضیح دهم. این توضیحات در مراحل اولیه و تا چند آموزش اول گنگ هستند اما به تدریج در ذهن شما شفاف خواهند شد. لذا تأکید زیادی بر روی آن نداشته باشید و فقط با دقت مطالب را مرور کنید.


ساختار دایرکتوری ساده ترین پروژه اندروید:


پروژه حاضر یعنی Test1 شامل چندین فایل و دایرکتوری است که مروری جزئی بر آنها داریم:
♦ دایرکتوری src که سورس Class File های Java * می باشند، از آنجایی که برای اندروید از زبان جاوا استفاده کنیم پس کل Source Code ما در این دایرکتوری قرار خواهد گرفت.

» در این دایرکتوری چیزی با نام com.uncocoder.course.test1 است که در ابتدای ساخت پروژه آنرا بصورت دستی وارد کردیم. این همان جایی است که اولین فرم نمایشی ما یعنی Test1Activity.java در آن ذخیره می شود. اگر با دایرکتوری DEV_ROOT/workspace/test1/src مراجعه کنید می بینید که هر کدام از Token * های . یک دایرکتوری هستند. یعنی فایل Test1Activity.java در دایرکتوری Test1 زیر شاخه course زیر شاخه uncocoder زیر شاخه com زیر شاخه src قرار دارد.

» به این مسیر ( در اینجا یعنی com.uncocoder.course.test1 ) می گوییم package name * و در صورتیکه مسیری باشد که در ساخت پروژه آنرا تعریف کرده باشیم به آن می گوییم Application Package Name.

» تمامی برنامه های اندروید با این نام منحصر بفرد از هم جدا می شوند تا تداخلی با یکدیگر نداشته باشند.

» نام گذاری Package Name رسم و رسومی دارد که از این لینک قابل مطالعه است و بطور خلاصه ابتدای آن مسیر سایت سازنده محصول است ( که بر عکس یادداشت می شود یعنی com.uncocoder ) و بعد از آن مسیری است که سازنده محصول برای دسته بندی محصولات خود به دلخواه تعیین می کند ( در این پروژه یعنی course.test1 ).

» تغییر دستی فایلها، rename کردن مسیر ها از داخل windows و مشابه چنین عملیاتی مرسوم نیست و باعث خراب شدن سورس پروژه می شود. طریقه تغییر نام package در قسمتهای آینده آموزش داده خواهد شد.

♦ با دایرکتوری gen کاری نخواهیم داشت ولی خروجی دسته بندی resource * ها هستند که در آینده توضیح داده خواهد شد. محتویات این دایرکتوری خود به خود تولید شده و ما هیچگاه ، هیچ عملیاتی روی این دایرکتوری انجام نداده و نباید انجام دهیم.

♦ کتابخانه ( Library * ) مورد نیاز پروژه که بنام Android 2.1 قرار داده شده و به پروژه متصل شده و شامل SDK مورد نیاز برای توسعه این نسخه از اندروید است.

♦ دایرکتوری assets که در اختیار ماست و می توانیم تمامی فایلهای صوتی، فونت ، binary, xml, html, text و ... را به غیر از تصاویر در آن قرار دهیم. ولی در چندین جلسه اول به آن کاری نخواهیم داشت.

♦ دایرکتوری bin که خروجی Build * پروژه شما خواهد بود. در این دایرکتوری علاوه بر فایلهای IL شده Java فایلی با پسوند apk وجود دارد که همان فایل خروجی نرم افزار اندروید شماست و قابل نصب بر روی هر گوشی اندرویدی خواهد بود. بحث مفصلی در مورد apk ها وجود دارد که به یک جلسه جدا موکول می شود.

♦ دایرکتوری res که شامل تمامی تصاویر، فایلهای UI مورد استفاده ( که XML * هستند )، String List, Color List و ... خواهد بود. به عبارتی منابعی که در چگونگی اجرای برنامه اندروید نقش اساسی دارند و در لحظه Build Time اهمیت پیدا می کنند در این دایرکتوری قرار می گیرند. این دایرکتوری بسیار بسیار حساس بوده و در صورت اشتباهاتی که منجر از مطالعه نکردن صحیح منابع موجود در برنامه نویسی اندروید است به راحتی شما را دچار بحران می کند. بنابراین در صورتیکه از نحوه عملکرد فایلی و جایگاه صحیح آن در این دایرکتوری مطلع نیستید با مطالعه قبلی مبادرت به کپی آن در این دایرکتوری کنید.

♦ فایل AndroidManifest.xml که مهمترین فایل ساختاری یک پروژه اندروید است و نحوه عملکرد برنامه شما را کنترل خواهد کرد. بسیاری از Crash * های قابل تولید در یک پروژه اندروید می تواند ناشی از بی توجهی به این فایل باشد. چگونگی استفاده از این فایل در چندین جلسه به مرور توضیح داده خواهد شد.

♦ دو فایل دیگر نیازی به توضیح ندارند ولی بی اهمیت نیستند و آنها را پاک نکنید.
 


توصیه ها:

- در صورتیکه به کار به گوشی های اندروید مسلط نیستید، با استفاده از Emulator به آن مسلط شوید و مکان تنظیم های مختلف گوشی را یاد بگیرید.
- Emulator بسیاری از امکانات گوشی ها را از قبیل چرخش گوشی، منو ها، دوربین عکاسی و ... را شبیه سازی می کند، برای آشنایی با کلید های Shortcut و قابلیتهای Emulator از اینترنت کمک بگیرید.
- ستاره موجود در متن آموزش را بی اهمیت قلمداد نکنید. در مورد مطالبی که از آنها اطلاعاتی ندارید، مرور کلی مطلب Wiki کمک بزرگی به شما خواهد کرد.
- برای آشنایی با محیط Eclipse گزینه های منو ها و تنظیمات را نگاه کنید و حدث بزنید که هر گزینه چه کاری می تواند انجام دهد. مسلماً تسلط بر همه گزینه ها فعلاً ممکن نیست.
- در صورتیکه با XML آشنایی ندارید حتماً بسیار زیاد آنرا مطالعه کنید. با آن خیلی کار خواهیم داشت.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

پنج شنبه 2 بهمن 1393  2:40 AM
تشکرات از این پست
tachberdee
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

آموزش:

در این قسمت قصد داریم که طریقه اتصال عناصر UI - User Interface * که در فایل XML تعریف می شوند را به کدهای جاوا یاد بگیریم. در اینصورت خواهیم توانست برای Button ها، EditBox ها، ImageView ها، ListView ها و ... برنامه بنویسیم.

در مرحله اول یک Button و یک TextView بر روی فرم اولیه ( main.xml ) قرار می دهیم و برنامه می نویسیم که با کلیک کردن بر روی Button نوشته داخل TextView تغییر کند. لذا دستور العمل زیر را دنبال کنید:
» با استفاده از آموزشهای قسمت دوم یک پروژه با پکیج com.uncocoder.course.lessons و نام پروژه AndroidCourse بسازید. این پروژه، پروژه ای خواهد بود که تا انتهای آموزشها با آن کار خواهیم کرد و آرشیوی از تمامی پروژه ها و کدهایی خواهد بود که در طول دوره آموزش دیده ایم.

» از پنل Package Explorer وارد AndroidCourse/res/layout/main.xml شوید. پس از مدتی یک صفحه تیره حاوی UI یی که در پروژه قبل به عنوان خروجی مشاهده کردید خواهید دید. یعنی تصویر زیر:


در تصویر بالا:
َA- محیط طراحی گرافیکی رابط کاربر ( Visual UI Designer ) که همین صفحه نمایش داده شده می باشد، است. خروجی طراحی انجام شده در این صفحه با B که نمایش XML رابط گرافیکی طراحی شده توسط شمااست. بنابراین A و B یکی هستند با دو نمایش متفاوت. هر تغییری در محیط A باعث تغییر در XML خروجی در محیط B می شود و بالعکس. خیلی اوقات راحتتر است که از محیط A استفاده کنیم و خیلی اوقات دیگر هم استفاده از محیط B راه گشاست بنابراین به یک محیط تکیه و بسنده نکنید.

B- نمایش UI طراحی شده در محیط A بصورت XML است و قابل ادیت می باشد.
C- رابط گرافیکی نهایی که بر روی گوشی نمایش داده خواهد شد. نمایش آن در این قسمت شبیه سازی می شود.
D- لیستی از UI Component * های در دسترس که با انتخاب و Drag آن می توانید به UI طراحی شده اضافه کنید.
E- در شرایطی که سایز مانیتور شما کوچک است ( Low Resolution ) ممکن است این Scroll دیده نشود و نتوانید لیست کاملی از UI Component ها را ببینید. با بزرگتر کردن کل محیط فوق و Resize کردن پنل سمت چپ، Scroll نمایان خواهد شد.

F- مجموعه ای از تنظیمات جهت بررسی UI تولید شده در سایزها مختلف گوشی های موبایل، ورژن های SDK متفاوت، Theme های متفاوت و ... . بنابراین می توانید UI خود را برای صحت عملکرد و نمایش، آزمایش کنید.

G- دکمه هایی که با استفاده از آنها می توانید نمایش UI را بزرگتر و کوچکتر کنید ( برای راحتتر شدن طراحی و یا دقیقتر شدن در ابعاد و ...)

» با انتخاب TextView اول که دارای محتوای Hello World, AndroidCourseActivity! است کلید Delete را روی کیبورد فشار دهید تا حذف شود.
» از لیست Palette ها، یک Button و یک TextView داخل UI ( پنجره سیاه ) Drag کنید.
» بر روی Button ، راست کلیک کنید و بزنید Edit ID و وارد کنید btn_action و OK بزنید، این نام اختیاری است اما توجه داشته باشید که حتماً باید تمامی حروف آن کوچک باشد و از _ برای جداکردن نام کلمات استفاده کنید. از Space و کاراکترهای نامتعارف جهت نامگذاری استفاده نکنید. با نوشتن btn_ در ابتدای نام دکمه ها به خوانا بودن نامگذاری کمک می کنیم.

» بر روی TextView ، راست کلید کنید و بزنید Edit ID و وارد کنید txt_caption و OK بزنید. از این پس به این فرآیند می گوییم Set کردن ID.
» حالا می توانید main.xml را ببندید.
» وارد فایل AndroidCourse/src/com.uncocoder.course.lessons/AndroidCourseActivity.java شوید. محیط ویرایش سورس جاوا باز می شود. سورس را به گونه زیر تغییر دهید.

ویرایش: نکته مهم: از این لحظه، هر گاه قرار هست چیزی رو تغییر بدیم به باقی فایل کاری نخواهیم داشت، نه سایر متدها را پاک می کنیم، نه package و import ها را پاک می کنیم، فقط متدهای موجود در کد را تغییر می دهیم. همینطور Line Number های کنار سورس کدها فقط برای توضیح خطوط است و مطمئناً می تواند با Line Number های دروس فایل شما متفاوت باشد.
 

کد:
01    public class AndroidCourseActivity extends Activity ..
02    
03        /** Called when the activity is first created. */
04        @Override
05        public void onCreate(Bundle savedInstanceState) ..
06            super.onCreate(savedInstanceState);
07            setContentView(R.layout.main);
08    
09            Button btn = (Button) findViewById(R.id.btn_action);
10            final TextView text = (TextView) findViewById(R.id.txt_caption);
11            btn.setOnClickListener(new OnClickListener() ..
12    
13                @Override
14                public void onClick(View v) ..
15                    text.setText("New String...");
16                }
17            });
18        }
19    }

توجه داشته باشید در صورتیکه مربع های خط چین ظاهر شدند کد شما نیاز به ورود و شناسایی Package Name مناسب دارد لذا در این شرایط بر روی کلمه OnClickListener با موس کمی صبر کنید، بعد از ظاهر شدن لیست گزینه Import OnClickListener (Android.view.View را انتخاب کنید. با اینکار یک خط جدید به لیست import های بالای همین فایل با محتوای import android.view.View.OnClickListener اضافه می شود که از این پس شناسایی صحیح این کلاس صورت می گیرد.
» با right click بر روی AndroidCourse و انتخاب Run As -> Android Application برنامه را اجرا کنید. دفعات بعد با زدن کلید F5 این عمل انجام می شود. در صورتیکه در نحوه اجرای Emulator و برنامه مشکل دارید، قسمت دوم آموزش را مطالعه کنید.
 


توضیح طریقه کار خطوط برنامه:

خط 7: به Activity می گوییم که فایل حاوی UI این پنجره در فایل main.xml قرار گرفته است.
خط 9: دکمه ای که ID آنرا btn_action قرار دادیم را به یک اشاره گر ( Pointer * ) در جاوا از جنس Button متصل می کنیم.
خط 10: متنی را که ID آنرا txt_caption قرار داریم را به یک اشاره گر در جاوا از جنس TextView متصل می کنیم. کلمه final فعلاً مهم نیست که چه کار می کند اما استفاده از آن در این نوع کد نویسی ضروری است.
حط 11: یک دستور العمل جدید برای پاسخ گویی به OnClick روی دکمه تعریف می کنیم. این دستور العمل درون onClick قرار می گیرد. لذا با کلیک شدن بر روی دکمه اجرا خواهد شد.
خط 15: دستور العمل اجرایی با کلیک بر روی دکمه است که می گوید محتوای TextView قرار داده شده در UI را به جمله New String تغییر بده.

خطوطی که توضیحی برای آنها ندادم را به عنوان یک کلیشه ( فعلاً ) در نظر بگیرید. با پیشرفت آموزشها و قسمتهای آموزش شیء گرایی این خطوط برای شما گویا خواهند شد اما الان دانستن علت نوشتاری آن گیج کننده و غیر ضروری است. کافیست این را بدانید که برای تعیین دستور العمل Click روی دکمه مورد نظر به چه شکل آنرا بنویسیم.
حالا برای تمیز تر شدن قطعه کد سورس را به شکل زیر تغییر دهید. این دو نوع نوشتار مانند یکدیگر عمل می کنند اما از نظر برنامه نویسی کد زیر بهتر است:
 

کد:
01    public class AndroidCourseActivity extends Activity ..
02    
03        private Button   btn  = null;
04        private TextView text = null;
05    
06    
07    
08        /** Called when the activity is first created. */
09        @Override
10        public void onCreate(Bundle savedInstanceState) ..
11            super.onCreate(savedInstanceState);
12            setContentView(R.layout.main);
13    
14            initializeUi();
15        }
16    
17    
18    
19        private void initializeUi() ..
20            btn = (Button) findViewById(R.id.btn_action);
21            text = (TextView) findViewById(R.id.txt_caption);
22    
23            btn.setOnClickListener(new OnClickListener() ..
24    
25                @Override
26                public void onClick(View v) ..
27                    text.setText("New String...");
28                }
29            });
30        }
31    }

خط 3 و 4: اشاره گرها تعریف و با مقدار اولیه null مقدار دهی می کنیم.
خط 14: به برنامه می گوییم متدی ( method * ) با نام initializeUi را که در همین کلاس تعریف شده است را اجرا کند.
خط 19: شروع به تعریف متد initializeUi می کنیم
خط 20: به اشاره گر تعریف شده با نام btn در همین کلاس مقداری ارجاع می دهیم.
خط 21: به اشاره گر تعریف شده با نام text در همین کلاس مقداری ارجاع می دهیم.
باقی خطوط: مانند گذشته است.


خوب این قسمت از آموزش هم به پایان رسید.


سورس برنامه و ورود پروژه جدید:

جهت دریافت سورس این پروژه می توانید از لینک زیر استفاده کنید.


جهت ورود یک پروژه از پیش تعریف شده مانند پروژه بالا در Eclipse به طریقه زیر عمل کنید:
» ابتدا باید مطمئن باشید که در Eclipse پروژه های همنام وارد نشوند بنابراین می توانید نام پروژه خود را تغییر دهید و آنرا به مثلاً با MyAndroidCourse تغییر دهید. به این منظور بر روی AndroidCourse راست کلیک کنید و انتخاب کنید Refactor->Rename و بنویسید MyAndroidCourse و تیک هم فعال باشد. سپس OK کنید. لذا پروژه شما تغییر نام پیدا می کند.

» منوی File->Import را بزنید و Existing Projects into Workspace را انتخاب کنید
» فایلی را که دانلود کرده اید در مسیر DEV_ROOT\download کپی کنید و آنرا با Extract To AndroidCourse در همین دایرکتوری Extract کنید. اگر نمی دانید DEV_ROOT چیست پس آموزشهای گذشته را به درستی مطالعه نکرده اید.

» مسیر DEV_ROOT\download را در قسمت Select root directory وارد کنید و با زدن Refresh پروژه های موجود در این مسیر را خواهید دید.
» پروژه مورد نظر را انتخاب و Finish بزنید.
» برای اجرای پروژه روی پروژه Right Click کنید و گزینه Run As->Android Application را انتخاب کنید.
» در صورتیکه قبلاً پروژه AndroidCourse دانلود شده در Eclipse وارد شده بود می توانید با انتخاب آن و زدن کلید Delete روی کیبورد آنرا از این لیست حذف کنید. با زدن تیک موجود در صفحه به نام Delete project content on disk فایلهای موجود در Hard Disk هم پاک می شوند و بدون زدن این انتخاب فایلها باقی خواهند ماند ولی پروژه از لیست پروژه ها حذف خواهد شد. اینجا انتخاب با خودتان است که تیک بزنید یا نزنید.

با توجه به اینکه شما پروژه خود را احتمالاً Rename خواهید کرد از این پس منظور از پروژه AndroidCourse همان پروژه ایست که شما در حال توسعه آن هستید با اینکه ممکن است آنرا به MyAndroidCourse تغییر نام داده باشید. پروژه های ارسال شده بصورت فایل، صرفاً جهت مرور شما هستند و آنها را تغییر ندهید. پس منظور از AndroidCourse پروژه ای است که شما توسعه می دهید.


توصیه ها:

- اگر با مفاهیم شیء گرایی ( Object Oriented * ) آشنایی لازم را ندارید بهتر است کتابی در مورد java تهیه و مطالعه کنید، با اینکه در این آموزشها با آن خواهیم پرداخت، اما مطالعه شما بهتر است.
- با استفاده از چند خط آموزش داده شده و کمی ابتکار عمل می توانید خیلی چیزها را آزمایش کنید و خودتان بسیازی از مفاهیم را دریابید. بنابراین زمینه وقت گذاشتن بر روی همین چند خط کد بسیار آماده است.
- اگر سرعتتان در تایپ و کار با ادیتور کم است، بسیار تمرین کنید. فاصله زمان تصمیم گرفتن به تغییر یا نوشتن یک قطعه کد تا اجرا کردن آن باید بسیار کوتاه باشد. یعنی چنانچه تصمیم به تغییر کد گرفتید اصلاً نباید به چگونگی تایپ آن فکر کنید بلکه بصورت غیر ارادی باید بتوانید این کار را انجام دهید. لذا در صورت نیاز بسیار تمرین کنید و یک قطعه کد را بارها و بارها بنویسید و ویرایش کنید.
- از سایر کنترلهای موجود در Palette کنترل ها استفاده کنید و ببنید که چه امکاناتی می توانیم در UI داشته باشیم.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

جمعه 3 بهمن 1393  1:49 AM
تشکرات از این پست
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

آموزش:

به دلیل اینکه قصد دارم این آموزشها برای کسانی که با برنامه نویسی هم هیچ آشنایی ندارند مفید واقع شود، این قسمت تکمیلی به دوره آموزشی اضافه شد. توجه داشته باشید اگر با برنامه نویسی آشنایی ندارد باید تلاشتان را چندین برابر افزایش دهید تا از پس سایر آموزشها برآیید.
ویرایش: جهت آزمایش کد های زیر می توانید از مثال آموزشی قسمت قبل استفاده کنید و در Text موجود روی صفحه تغییری حاصل کنید. بطور مثال برای نمایش مقدار عددی aValue بر روی TextView موجود در صفحه برنامه قسمت OnClick را به شکل زیر تغییر دهید:
 

کد:
 01    btn.setOnClickListener(new OnClickListener() ..
02    
03        @Override
04        public void onClick(View v) ..
05            text.setText("Value is " + aValue);
06        }
07    });

برای استفاده آن در حلقه های گردشی هم می تواند ابتدا نتیجه خود را در یک String ذخیره کنید و سپس setText کنید، مانند مثال زیر:
 

کد:
01    btn.setOnClickListener(new OnClickListener() ..
02    
03        @Override
04        public void onClick(View v) ..
05    
06            String output = "Values are: " + "\n";
07            for (int i = 0; i < 10; i++) ..
08                output = output + i + "\n";
09            }
10    
11            output = output + "End For" + "\n";
12    
13            text.setText(output);
14        }
15    }

توجه داشته باشید که استفاده از "n\" باعث نوشته شدن باقی متن در خط بعدی می شود. خروجی قطعه برنامه بالا پس از کلیک بر روی دکمه به شکل زیر است:


متغیرها ( Variables * ) :
متغیرها اشاره کننده هایی به قسمتی از حافظه کامپیوتر هستند که در آن مقداری نهفته است. بطور مثال وقتی می گوییم int value=2 یعنی متغیر value از جنس int ( اعداد صحیح بین -2,147,483,648 تا 2,147,483,647 ) است که نیاز به اشغال 32بیت یا همان 4 بایت از حافظه دارد. متغیر value فقط به آدرس اولین بایت از این حافظه مورد نیاز اشاره می کند. با استفاده از عملگر ( Operator * ) تساوی ( = ) می گوییم که مقدار این فضا ( که 4 بایت است ) 2 باشد. هر گاه متغیر value را بخوانیم، داریم مقدار حافظه متصل شده به این متغیر را می خوانیم. نیاز نیست خیلی نگران چگونگی عملکرد جاوا در خواندن و نوشتن متغیرها باشید اما خوب بود که بدانید معنی واقعی یک متغیر چیست.
با توجه به توضیح فوق می توانیم متغیرهایی از جنس های مختلف ( محدود اعدادی که ساپورت می کند، نوع اعدادی که ساپورت می کند و ... ) داشته باشیم. نوع متغیرهایی که در جاوا قابل استفاده است که به آنها Primitives می گوییم در لینک * موجود و قابل مطالعه است.
برای تعریف کردم متغیرها با نوع های مختلف کد زیر می تواند به شما کمک کند.
 

کد:
01            byte    aValue = 1;
02            short   bValue = 1;
03            int     cValue = 1;
04            long    dValue = 1;
05            float   eValue = 2.0f;
06            double  fValue = 2.0d;
07            boolean gValue = false;
08            char    hValue = 'A';

 


عملگرها ( Operators * ) :
با استفاده از عملگرها می توانید مقادیر یک متغیر را تغییر دهید. مثلاً عملگرهای زیر برای متغیرهایی از نوع عددی قابل استفاده است.
 

کد:
01            cValue++;               //cValue will be 2
02            cValue--;               //cValue will be 1
03            cValue += 3;            //cValue will be 4
04            cValue -= 2;            //cValue will be 2
05            cValue *= 3;            //cValue will be 6
06            cValue = aValue + 1;    //cValue will be 7
07            cValue = 5;             //cValue will be 5
08            cValue = 6 * 2 + 3;     //cValue will be 15

عبارت بعد از // صرفاً توضیحی است و هیچ اثری بر چگونگی اجرای برنامه ندارد، به آنها Comments می گوییم. همانطور که می بینید در انتهای هر خط از دستور یک ; درج شده است که معرف اتمام دستور است.
جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


عبارات کنترل شرط ( IF Statements * ):
برای مقایسه دو مقدار یا متغیر و انجام عملکرد مناسب از دستور if استفاده می کنیم. به کدهای زیر توجه کنید:
 

کد:
01        int aValue = 2;
02        int bValue = 3;
03        
04        if (aValue < bValue) ..
05            // code statements here when aValue<bValue
06        } else ..
07            // code your statements when aValue>=bValue
08        }
09        
10        boolean cValue = false;
11        if (cValue) ..
12            // code statements here when cValue=true
13        } else ..
14            // code your statements when cValue=false
15        }
16        
17        if ( !cValue) ..
18            // code statements here when cValue=false
19        } else ..
20            // code your statements when cValue=true
21        }
22        
23        boolean dValue = aValue < bValue;
24        if (dValue) ..
25            // code statements here when aValue<bValue
26        } else ..
27            // code your statements when aValue>=bValue
28        }
29        
30        float eValue = 4.0f;
31        float fValue = 5.0f;
32        if ((aValue < bValue) && (eValue < fValue)) ..
33            // code statements here when aValue<bValue and eValue<fValue
34        } else ..
35            // code statements here when aValue>=bValue or eValue>=fValue
36            // for more information see boolean algebra concepts
37        }
38        
39        int gValue = 54;
40        if (gValue > 100) ..
41            // code statements here when gValue>100
42        } else if (gValue > 50) ..
43            // code statements here when gValue>50
44        } else if (gValue > 0) ..
45            // code statements here when gValue>0
46        } else ..
47            // code statements here when gValue<=0
48        }

جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


حلقه ها ( For-Loops * ) :
جهت مشخص شدن طریقه کار به کدها و Comment های زیر توجه کنید.
 

کد:
01        for (int i = 0; i < 3; i++) ..
02            Log.i("LOG", "i is: " + i);
03        }
04        /* output:
05         * i is: 0
06         * i is: 1
07         * i is: 2
08         */
09    
10        for (int i = 3; i > 0; i--) ..
11            Log.i("LOG", "i is: " + i);
12        }
13        /* output:
14         * i is: 3
15         * i is: 2
16         * i is: 1
17         */
18    
19        for (int i = 3; i > 0; i--) ..
20            Log.i("LOG", "Statement");
21        }
22        /* output:
23         * Statement
24         * Statement
25         * Statement
26         */
27    
28        for (float num = 0.8f; num > 0.1f; num -= 0.3f) ..
29            Log.i("LOG", "num is: " + num);
30        }
31        /* output:
32         * num is: 0.8
33         * num is: 0.5
34         * num is: 0.2
35         */
36    
37        for (int i = 1; i < 3; i++) ..
38            for (int j = 1; j <= 4; j++) ..
39                Log.i("LOG", i + "*" + j + "=" + (i * j));
40            }
41        }
42        /* output:
43         * 1*1=1
44         * 1*2=2
45         * 1*3=3
46         * 1*4=3
47         * 2*1=2
48         * 2*2=4
49         * 2*3=6
50         * 2*4=8
51         */

جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


حلقه ها ( While-Loops * ) :
 

کد:
01        int aValue = 0;
02        while (aValue < 2) ..
03            Log.i("LOG", "value is: " + aValue);
04            aValue++;
05        }
06        /* output:
07         * value is: 0
08         * value is: 1
09         */
10    
11        while (aValue < 2) ..
12            Log.i("LOG", "value is: " + aValue);
13            aValue++;
14        }
15        /* output:
16         */
17    
18        aValue = 0; //reset aValue again
19        while (aValue < 2) ..
20            aValue++;
21            Log.i("LOG", "value is: " + aValue);
22        }
23        /* output:
24         * value is: 1
25         * value is: 2
26         */
27    
28        float bValue = 0.8f;
29        while (bValue > 0.1f) ..
30            Log.i("LOG", "value is: " + bValue);
31            bValue -= 0.3f;
32        }
33        /* output:
34         * value is: 0.8
35         * value is: 0.5
36         * value is: 0.2
37         */
38    
39        int cValue = 2;
40        do ..
41            Log.i("LOG", "value is: " + cValue);
42            cValue++;
43        }
44        while (cValue < -5); //! :)
45        /* output:
46         * value is: 2
47         */
48        }

جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


انتخاب ( Switch Statement * ) :
 

کد:
01        int aValue = 3;
02        String aValueStr = "";
03        
04        switch (aValue) ..
05            case 1:
06                aValueStr = "One";
07                break;
08            case 2:
09                aValueStr = "Two";
10                break;
11            case 3:
12                aValueStr = "Three";
13                break;
14            case 4:
15                aValueStr = "Four";
16                break;
17            default:
18                aValueStr = "Unknown Number";
19                break;
20        }
21        Log.i("LOG", "String representation of " + aValue + " is " + aValueStr);
22        /* output:
23         * String representation of 3 is Three
24         */

جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


توابع ( Functions * ) :
تابع مجموعه دستور العملی است که با دریافت ورودی ها، پردازشی انجام داده و خروجی مناسب ارائه می دهد. یک تابع ممکن است مقدار ورودی نداشته باشد، همینطور ممکن است خروجی نداشته باشد. تعداد ورودی ها هر عددی می تواند باشد اما خروجی همیشه یکی است. یک تابع مثل زیر تعریف می شود:
 

کد:
01         int doWork(float number1, boolean bool) ..
02            Log.i("LOG", "Number is : " + number1);
03            if (bool) ..
04                Log.i("LOG", "Boolean value is true");
05            } else ..
06                Log.i("LOG", "Boolean value is false");
07            }
08    
09            int result = (int) (number1 * 2);
10            return result;
11        }

تابع بالا دارای ورودیهای number1 از جنس float و bool از جنس boolean می باشد. همینطور خروجی آن از جنس int می باشد. با استفاده از return می توان مقدار مورد نظر را از تابع خارج کرد. برای استفاده از تابع بالا از دستور زیر استفاده می کنیم.
 

کد:
01            int value = doWork(3.0f, false);
02            Log.i("LOG", "Value is: " + value);

همانطور که می بینید خروجی تابع را درون یک متغیر از جنس خروجی تابع ریختیم و آن را چاپ کردیم. با ورود مقدار 3.0 باید عدد 6 به عنوان خروجی تابع برگردانده شود.
جهت کسب اطلاعات بیشتر می توانید از لینک * استفاده کنید


قالب یک فایل جاوا:
یک فایل جاوا همیشه حاوی یک class یا یک interface است و نمی توان کدهای برنامه نویسی را همان جا نوشت بلکه باید داخل class ها نوشته شود. در ابتدای فایلهای جاوا نام package ـی که class در آن تعریف شده نوشته می شود. سپس لیستی از package ها و کلاسهای مورد نیاز این کلاس توسط import درخواست می شود. سپس کلاس تعریف شده و با تعریف فیلدها و متدها ( که در قسمت چهارم این آموزشها توضیح داده شده ) کلاس تکمیل می شود. به مثال زیر توجه کنید.
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    import android.util.Log;
04    
05    public class CourseHelper ..
06    
07        private CourseHelper() ..
08            call();
09        }
10    
11    
12    
13        int doWork(float number1, boolean bool) ..
14            Log.i("LOG", "Number is : " + number1);
15            if (bool) ..
16                Log.i("LOG", "Boolean value is true");
17            } else ..
18                Log.i("LOG", "Boolean value is false");
19            }
20    
21            int result = (int) (number1 * 2);
22            return result;
23        }
24    
25    
26    
27        void call() ..
28            int value = doWork(3.0f, false);
29            Log.i("LOG", "Value is: " + value);
30        }
31    }

توصیه ها:
- در صورتیکه این مطالب برای شما تازگی داشت حتماً بسیار مطالعه کنید، چون شرط لازم برای ادامه آموزشها دانستن مقدمات برنامه نویسی خواهد بود.
- ممکن است نتوانید کدهای بالا را اجرا کنید چون طریق اجرا فعلاً برای شما دشوار است اما در قسمتهای آینده هر جا که توانستید تمام کدهای بالا را آزمایش و با ابتکار عمل خود سعی در فهم دقیق دستورات نمایید.
- اگر سرعتتان در تایپ و کار با ادیتور کم است، بسیار تمرین کنید. فاصله زمان تصمیم گرفتن به تغییر یا نوشتن یک قطعه کد تا اجرا کردن آن باید بسیار کوتاه باشد. یعنی چنانچه تصمیم به تغییر کد گرفتید اصلاً نباید به چگونگی تایپ آن فکر کنید بلکه بصورت غیر ارادی باید بتوانید این کار را انجام دهید. لذا در صورت نیاز بسیار تمرین کنید و یک قطعه کد را بارها و بارها بنویسید و ویرایش کنید.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

جمعه 3 بهمن 1393  1:51 AM
تشکرات از این پست
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

مقدمه بسیار مهم: 

در این قسمت قصد دارم، مبانی و تعاریف اولیه شیء گرایی OO - Object Oriented * را بیان کنم. چرا که در عصر حاضر برنامه نویسی بدون دانستن این مفاهیم کاری بیهوده و غیر اصولی است. از طرف دیگر توضیح دادن بسیاری از مفاهیم برنامه نویسی جاوا و بالتبع اندروید نیازمند دانستن این مفاهیم است. لذا این قسمت را با صبر و حوصله مطالعه و آنرا مهم بدانید.
مفهوم شیء گرایی بر پایه ذات واقعی طبیعت که میراث بری است استوار است. اگر دنیای مادی را جامعه هدف مطالعات خود بگیریم، هر موجودی یک چیز است. شاید بهتر باشد از واژه چیز به Entity اشاره کنیم. در حالت کلی تر اگر هر Entity را یک Object بنامیم ( که در تئوری تفاوت هایی دارند ) آنگاه هر چیز یک Object است. لذا خواص کلی موجود در هر کلاس ( Class * ) از Object ها به سایر Object ی زیر مجموعه آن کلاس به ارث ( Inheritence * ) خواهد رسید.
بطور مثال اگر اشیاء جامد را Object در نظر بگیریم آنگاه کلاس هر Object دارای خواصی نظیر ( اندازه، وزن، مکان، جنس و ... ) است. حال اگر دسته ای از زیر شاخه های این کلاس را مانند وسایل الکترونیکی ElectronicDevice در نظر بگیریم آنگاه غیر از خواص فوق دارای خواص دیگری نظیر ( ولتاژ ورودی، میزان مصرف انرژی و ... ) هستند. حال اگر دسته های Computer را زیر مجموعه ElectronicDevice در نظر بگیریم علاوه بر خواص کلاس Object شامل اندازه و ... ، شامل خواص کلاس ElectronicDevice نظیر ولتاژ ورودی و ... هم هست علاوه بر اینکه می تواند خود دارای خواص ویژه ای نظیر Cpu Model, Ram Size , ... باشد. به همین ترتیب هر کلاس دیگری می تواند خواص والدین ( superclass یا parent ) خود را به ارث ببرد و خواص منحصر به فرد خودش را هم دارا باشد. به این خواص قابل اندازه گیری Field می گوییم.
علاوه بر Field ها که خواصی هستند قابل اندازه گیری مانند وزن و ...، می توان دستورالعمل هایی هم برای هر کلاس تعریف کرد که به آنها Method می گوییم. مثلاً در کلاس Object ، دستور العملی که به حرکت جسم منجر می شود را می توان یک Method دانست. چگونگی پیدایش، مردن، و ... هم می توانند Method های آن باشند. این دستورالعمل ها نیز مانند Field ها به کلاسهای زیرین ( subclass ) ها مثل ElectronicDevice قابل ارث بری هستند. اما ElectronicDevice هم برای خود دستورالعمل های منحصر به کلاسی دارد مثل چگونگی روشن شدن، خاموش شدن، کار کردن و ... . و همینطور در مثال Computer هم دستورالعمل های Boot شدن، Restart شدن و .... می توانند Method باشند. بنابراین یک Computer هم چون یک subclass از ElectronicDevice است، دستورالعمل های آن شامل روشن شدن، خاموش شدن، کار کردن را به ارث می برد و همینطور از Object یعنی چگونگی پیدایش، مردن، حرکت کردن و ...
تا اینجای کار همه چیز خوب و شفاف به نظر می رسد اما وقتی چالش های بیشتری در عمل بوجود می آید تعاریف ساده فوق به تنهایی پاسخگوی مشکلات نخواهند بود. بطور مثال اگر دو دسته از کلاس ها مانند ElectronicDevice, اشیاء دارای درب را دو کلاس متفاوت subclass ـی از Object در نظر بگیریم، آنگاه یک Laptop زیرکلاسی از کدام خواهد بود؟ نه می شود اشیاء درب دار را زیر کلاس ElectronicDevice در نظر گرفت نه بالعکس. از طرفی Laptop هر دو خواص را دارد. در اینجاست که مفاهیم دیگری از شیء گرایی مانند Interface * ها به کمک ما می آیند. و به همین ترتیب پیدا کردن راه حل مناسب برای مشکلات پیچیده تر نیازمند دانش گسترده تر در این باره خواهد بود.
به همین منظور ما ابتدا از تعاریف ساده شروع می کنیم و تا پایان آموزشها هر از چند گاهی که با چالش جدیتری مواجه می شویم، مفاهیم جدیدتری از شیء گرایی را بیان می کنیم تا مشکل ما را حل کند. پس از ساده ترین مفاهیم شروع خواهیم کرد.


آموزش:
در جاوا یک کلاس به نام Object وجود دارد که هر چیزی که تعریف می شود به طور پیش فرض subclass ـی از Object هست. برای تعرف یک کلاس جدید در Java به ترتیب زیر عمل می کنیم.
» بر روی AndroidCourse/src/com.uncocoder.course.lessons راست کلیک کنید و بزنید New->Class. توجه داشته باشید از این به بعد به عمل فوق می گوییم که یک کلاس در com.uncocoder.course.lessons بسازید.
» در پنجره باز شده فقط قسمت Name را پر کنید و بنویسید Vehicle ، همانطور که می بینید در قسمت Superclass نوشته است java.lang.Object . این همان کلاسی است که هر کلاس دیگر از آن میراث بری می کند. حال Finish بزنید. کدی که به شما نمایش داده می شود، همانطور که از محتویاتش پیداست، تعریف یک کلاس را در بردارد. خط اول آن نام پکیجی که کلاس در آن باید ساخته شود را تعیین می کند. توجه داشته باشید که نام فایل جاوای ساخته شده دقیقاً با نام کلاس یکی است و اگر قرار باشد نام کلاس عوض شود باید نام فایل هم عوض شود و بالعکس.
» کد Vehicle را به شکل زیر Edit کنید:
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    
04    public class Vehicle ..
05    
06        public float mPositionX = 0;
07        public float mPositionY = 0;
08        public float mPositionZ = 0;
09    
10        public int   mWeight    = 0;
11        public float mSpeed     = 0;
12    
13    
14    
15        public Vehicle(float speed, int weight) ..
16            Log.i("LOG", "Vehicle Created with Speed: " + speed + ", Weight: " + weight);
17            mSpeed = speed;
18            mWeight = weight;
19        }
20    
21    
22    
23        public void turnOn() ..
24            Log.i("LOG", "Vehicle Turned On");
25        }
26    
27    
28    
29        public void turnOff() ..
30            Log.i("LOG", "Vehicle Turned Off");
31        }
32    
33    
34    
35        public void startMove() ..
36            Log.i("LOG", "Vehicle Starts Moving");
37        }
38    }

» با تغییر کد دور Log مربع خط چینی بوجود می آید و ناشی از این است که Eclipse با اجازه شما می خواهد PackageName مناسب کلاس Log را وارد برنامه کند. با نگه داشتن موس روی آن، پنجره ای باز می شود که دارای گزینه Import Log ( android.util است. شما این گزینه را انتخاب کنید. در نتیجه عبارت import android.util.Log به بالای فایل اضافه می شود. از این پس در صورت دیدن این مربع خط چین برای Log کار فوق را انجام دهید و در آموزشها، دیگر به آن اشاره نخواهد شد.
متغیرهای mPositionX, mPositionY, mPositionZ, mWeight, mSpeed همه همان Field هایی هستند که در بخش مقدمه از آن صحبت کردیم. و turnOn, turnOff, startMove متد هایی هستند که در بخش مقدمه در مورد آن صحبت کردیم. نام Vehicle که بالای turnOn نوشته شده است را Constructor می گوییم. Constructor ها متدهای همنام با کلاس هستند که در پشت آنها عبارت void یا هر مقدار بازگشتی دیگر وجود نداشته باشد. هنگامیکه یک نمونه از کلاس ساخته می شود، این تابع در صورت وجود صدا زده می شود، اگر هم وجود نداشته باشد بازهم نمونه ساخته می شود اما بدون اینکه ما دخالتی در نحوه ساخت آن داشته باشیم.
» عبارت Log در هم خط باعث می شود در log خروجی پروژه اندروید متن دلخواه با استفاده از تگ LOG چاپ شود. برای دیدن این خروجی می توانید به نحوه زیر عمل کنید:



A: اگر این Tab در پنل پایین Eclipse موجود هست که روی آن کلیک کنید. اگر نه با رفتن به منوی Window->Open Perspective->Other گزینه All In One را انتخاب و OK بزنید.
B: با زدن این گزینه و وارد کردن LOG در دو کادر اول و زدن OK یک Filter جدید برای log ها خواهید ساخت که فقط پیامهایی را نشان می دهد که با تگ LOG در برنامه نوشته شده ارسال شده اند.
C: در صورتیکه برنامه به خطوط Log برسد، عبارات درج شده در پارامتر دوم این تابع، در این قسمت نمایش داده شود. اگر این اتفاق نیافتاد با رفتن به Devices در پنل سمت راست Eclipse و انتخاب emulator-5554 مشکل حل خواهد شد.
ویرایش: توجه داشته باشید که در این مرحله کلاس تعریف شده است ولی هیچ نمونه ای از آن ساخته نشده، در این شرایط انتظار نخواهیم داشت که Log ها در خروجی ثبت شوند چرا که هم اکنون، متد و دستوری باعث نمی شود که این خطوط اجرا شوند. با تغییر زیر می توانید یک نمونه از کلاس را ایجاد کنید و سرانجام خروجی Log ها را مشاهده نمایید.
کلاسها صرفاً یک الگو برای ساخت اشیاء هستند مثلاً می گوییم از جنس کامپیوتر، از جنس وسیله نقلیه و ... اما یک وسیله نقلیه یک نمونه ساخته شده از آن الگو ( یا همان کلاس است ). به این نمونه instance می گوییم. طریقه ساخت یک instance از کلاس Vehicle به طریقه زیر ممکن است. در پروژه قسمت سوم می خواهیم با کلیک شدن بر روی دکمه یک instance از Vehicle بسازیم. پس کاریهای زیر را انجام دهید:
» با باز کردن فایل AndroidCourseActivity.java متد initializeUi را به شکل زیر تغییر دهید:
 

کد:
01    private void initializeUi() ..
02        btn = (Button) findViewById(R.id.btn_action);
03        text = (TextView) findViewById(R.id.txt_caption);
04    
05        btn.setOnClickListener(new OnClickListener() ..
06    
07            @Override
08            public void onClick(View v) ..
09                text.setText("New String...");
10                Vehicle myVehicle = new Vehicle(200f, 800);
11                myVehicle.turnOn();
12                myVehicle.startMove();
13                myVehicle.turnOff();
14            }
15        });
16    }


خط 10: یک نمونه از Vehicle را می سازیم. به علت اینکه Constructor این کلاس را بطوری تعریف کرده ایم که یک پارامتر float و یک int بگیرد، باید با همون الگوی ساخته شده آنرا صدا بزنیم، در غیر اینصورت Eclipse از کد ما خطا می گیرد.
خط 11: به نمونه ساخته شده می گوییم که turnOn کند
خط 12: به نمونه ساخته شده می گوییم که startMove کند
خط 13: به نمونه ساخته شده می گوییم که turnOff کند
توجه داشته باشید که با اجرای این برنامه و کلیک روی دکمه پنل LogCat لیست پیامهای ارسالی از سمت شما با استفاده از Log.i را نمایش می دهد.

حالا برای اینکه خواصی که این کلاس از Object به ارث برده است را ببینید داخل یکی از متد ها کلید Ctrl+Space را بزنید. پنجره زیر نمایش داده می شود:


متدها و فیلدهایی که دور آن کادر قرمز رنگ کشیده ام متعلق به کلاس Vehicle هستند که ما تعریف کرده ایم و اگر به آخرین کلمه در آن سطر توجه کنید این را در می یابید. اولین آیتم هم Constructor است که از Icon آن که شبیه یک C است مشخص می شود. باقی آیتم های این لیست از کلاس Object ارث بری شده اند که قابل استفاده در این کلاس هم می باشند. باز هم از کلمه آخر این لیست کلاس دربرگیرنده متد یا فیلد مشخص است. همینطور در این لیست نوع داده Field ها مثل float, int مشخص است. همینطور نوع برگشتی متد ها نیز مشخص است که ما برای همه متدها فعلاً void تعریف کرده ایم. به پنجره باز شده Code Completion یا Code Suggestion می گویند.


مفهوم Visibility: 
» برای روشن شدن این مفهوم کد داخل Vehicle را به شکل زیر تغییر دهید.
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    import android.util.Log;
04    
05    public class Vehicle ..
06    
07        public float mPositionX = 0;
08        public float mPositionY = 0;
09        public float mPositionZ = 0;
10    
11        public int   mWeight    = 0;
12        public float mSpeed     = 0;
13    
14        private int  mType      = 0;
15    
16    
17    
18        public Vehicle(float speed, int weight) ..
19            Log.i("LOG", "Vehicle Created with Speed: " + speed + ", Weight: " + weight);
20            mSpeed = speed;
21            mWeight = weight;
22        }
23    
24    
25    
26        public void setType(int type) ..
27            mType = type;
28            Log.i("LOG", "Vehicle Type Set!");
29        }
30    
31    
32    
33        public int getType() ..
34            Log.i("LOG", "Vehicle Type is: " + mType);
35            return mType;
36        }
37    
38    
39    
40        public void turnOn() ..
41            Log.i("LOG", "Vehicle Turned On");
42        }
43    
44    
45    
46        public void turnOff() ..
47            Log.i("LOG", "Vehicle Turned Off");
48        }
49    
50    
51    
52        public void startMove() ..
53            Log.i("LOG", "Vehicle Starts Moving");
54        }
55    }

خط 14: یک فیلد private تعریف کرده ایم و با استفاده از دو متد به نامهای setType و getType می توانیم آنرا با مقدار داده شده Set کنیم یا مقدار آنرا بخوانیم. توجه کنید که خروجی getType از نوع int است و همان نوعی است که mType دارد. با استفاده از عبارت return می توانیم مقداری را از متد به عنوان خروجی به سمت صدا زننده متد برگردانیم. اصطلاحاً به استفاده از دو متد با شکل و شمایل setType و getType می گویند Encapsulate کردن mType . حالا این چیست و چه کمکی به ما میکند و به Visibility چه ارتباطی دارد را با تغییر کد زیر می توان بهتر درک کرد.

» کد متد initializeUi کلاس AndroidCourseActivity را به شکل زیر تغییر دهید:
 

کد:
01    private void initializeUi() ..
02            btn = (Button) findViewById(R.id.btn_action);
03            text = (TextView) findViewById(R.id.txt_caption);
04    
05            btn.setOnClickListener(new OnClickListener() ..
06    
07                @Override
08                public void onClick(View v) ..
09                    text.setText("New String...");
10                    Vehicle myVehicle = new Vehicle(200f, 800);
11                    myVehicle.turnOn();
12                    myVehicle.startMove();
13                    myVehicle.turnOff();
14    
15                    myVehicle.mPositionX = 10;
16    
17                    /* it's wrong code */
18                    //myVehicle.mType = 2;
19    
20                    myVehicle.setType(2);
21                    Log.i("LOG", "My Vehicle Type is: " + myVehicle.getType());
22                }
23            });
24        }

همانطور که مشخص است در خط 15 توانستیم مقدار فیلد mPositionX را set کنیم اما همین کار را در خط 18 با فیلد mType نمی توانیم انجام دهیم و منجر به خطا از سمت Eclipse می شود. چرا که فیلد mPositionX یک فیلد Public ( عمومی ) است و از بیرون کلاس قابل خواندن و نوشتن است اما فیلد mType یک فیلد private ( خصوصی ) است و فقط از داخل خود آن کلاس قابل خواندن و نوشتن است. بنابراین با استفاده از متدهای setType, getType که هر دو public هستند می توانیم از بیرون کلاس مقدار mType را تحت تأثیر قرار دهیم. همانطور که در خطوط 20, 21 میبینید.
به این نوع دیدن متغیرها ( که گاهی مخفی و گاهی عمومی ) است Visibility می گوییم. همین شرایط در مورد متد ها هم برقرار است. یعنی می توانیم متدهای private تعریف کنیم که فقط از داخل کلاس قابل صدا زدن هستند و از بیرون قابل دید نیستند. اگر دقت کرده باشید turnOn, startMove, turnOff و همینطور Constructor دارای public visibility هستند و به این خاطر بود که توانستیم از خارج از کلاس آنها را صدا بزنیم.
حسن Visibility بسیار زیاد است شامل:
- محدود کردن کد، بنابراین سایر برنامه نویسان چیزهایی را می توانند تغییر دهند که ما اجازه داده ایم.
- حفظ کردن پایداری برنامه بدلیل محدود شدن برنامه نویس در شرایط گمراه کننده و انتخاب مسیر صحیح تر
- چک کردن مقادیر ورودی و سپس واریز آنها در متغیر
- انجام عملیات خاص در هنگام خواندن مقدار متغیر
- خلوت شدن لیستی از متغیر ها و متد ها و بنابراین راحتتر پیدا کردن اطلاعات لازم در code completion
- و بسیاری دیگر...

آموزش شیء گرایی مسیر بسیار مهم و طولانی خواهد بود. بنابراین با همین تعاریف کار کنید تا در یک مثال به این سادگی مشکلی وجود نداشته باشد. و منتظر آموزشهای بعدی در مورد شیء گرایی باشید.


سورس برنامه:
می توانید سورس را از آدرس زیر دانلود کنید:


 


توصیه ها:
- اگر با مفاهیم شیء گرایی ( Object Oriented * ) آشنایی لازم را ندارید بهتر است کتابی در مورد java تهیه و مطالعه کنید، با اینکه در این آموزشها با آن خواهیم پرداخت، اما مطالعه شما بهتر است.
- با همین مفاهیم اولیه در مورد شیء گرایی بسیار تمرین کنید و خود را در این مفاهیم قوی کنید تا در آموزشهای آتی بسیار راحتتر عمل کنید.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

جمعه 3 بهمن 1393  1:56 AM
تشکرات از این پست
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

مقدمه: 

در قسمت قبل چند تعریف پایه ای از شیء گرایی مورد بررسی قرار گرفت، در این قسمت بحث پایه ای شیء گرایی را ادامه می دهیم. توجه کنید که این مباحث بسیار مهم است و آن چیزی که می نویسیم بیشتر شیء گرایی جاوا است تا اندروید.


آموزش:

در گذشته های نه چندان دور برنامه نویسی به این شکل بود که فایلهای خالی تشکیل می دادیم و دستورات را پشت سرهم می نوشتیم و اجرا می شد. در زمان حاضر برنامه نویسی به این شکل مگر در اسکریپ ها ( Scripting Languages * ) کاملاً غیر مرسوم و بلا استفاده است، بلکه ما از کلاسها برای نوشتن کدهای خود استفاده می کنیم که خواص بسیاری دارند و محدودیتهایشان هم سودمند است.
یکی از این تغییرات موجود در جاوا، ثابتها Constants * هستند، در هر کلاس مرتبط، میتوان const های خاص آن کلاس را تعریف کرد. در Java واژه const وجود ندارد. برای روشن شدن تعریف کدهای جلسه قبل را به شکل زیر تغییر دهید.
» کد مربوط به کلاس Vehicle.java را به شکل زیر تغییر دهید.
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    import android.util.Log;
04    
05    public class Vehicle ..
06    
07        public final static int     TYPE_UNDEFINED = 0;
08        public final static int     TYPE_CAR       = 1;
09        public final static int     TYPE_BOAT      = 2;
10        public final static int     TYPE_AIRPLANE  = 3;
11    
12        private final static String DEBUG_TAG      = "LOG";
13    
14        public float                mPositionX     = 0;
15        public float                mPositionY     = 0;
16        public float                mPositionZ     = 0;
17    
18        public int                  mWeight        = 0;
19        public float                mSpeed         = 0;
20    
21        private int                 mType          = 0;
22    
23    
24    
25        public Vehicle(float speed, int weight) ..
26            Log.i(DEBUG_TAG, "Vehicle Created with Speed: " + speed + ", Weight: " + weight);
27            mSpeed = speed;
28            mWeight = weight;
29        }
30    
31    
32    
33        public void setType(int type) ..
34            if (type == TYPE_CAR) ..
35                Log.i(DEBUG_TAG, "Vehicle is Car");
36    
37            } else if (type == TYPE_BOAT) ..
38                Log.i(DEBUG_TAG, "Vehicle is Boat");
39    
40            } else if (type == TYPE_AIRPLANE) ..
41                Log.i(DEBUG_TAG, "Vehicle is Airplane");
42    
43            } else if (type == TYPE_UNDEFINED) ..
44                Log.i(DEBUG_TAG, "Type Undefined, Define a Valid Type");
45                return;
46    
47            } else ..
48                Log.i(DEBUG_TAG, "Use Const Values to Define a Type");
49                return;
50            }
51    
52            mType = type;
53            Log.i(DEBUG_TAG, "Vehicle Type Set!");
54        }
55    
56    
57    
58        public int getType() ..
59            Log.i(DEBUG_TAG, "Vehicle Type is: " + mType);
60            return mType;
61        }
62    
63    
64    
65        public void turnOn() ..
66            Log.i(DEBUG_TAG, "Vehicle Turned On");
67        }
68    
69    
70    
71        public void turnOff() ..
72            Log.i(DEBUG_TAG, "Vehicle Turned Off");
73        }
74    
75    
76    
77        public void startMove() ..
78            Log.i(DEBUG_TAG, "Vehicle Starts Moving");
79        }
80    }

خط 7 تا خط 10: چهار const از نوع int با مقادیر 0 تا 3 را با دید public تعریف کردیم، بنابراین از هر کلاسی قابل استفاده است.
خط 12: یک const از نوع String با مقدار "LOG" را با دید private تعریف کردیم، بنابراین فقط از داخل این کلاس قابل استفاده است.
خط های حاوی Log.i : با استفاده از ثابت DEBUG_LOG که مقدار "LOG" را دارد، log ها را چاپ می کنیم.
خط 34 تا 53: با استفاده از if..elseif...else مقادیر مختلف mType را چک کرده و پیغام مناسب را log می کنیم.
خط 45 و 49: با استفاده از return از ادامه متد منصرف می شویم بنابراین باقی خطوط بعد از این خط ها اجرا نخواهند شد.

همانطور که از کدهای بالا مشخص است یک const با استفاده از واژه static final تعریف می شود و به کمک visibility نوع دید سایرین به آن را تعیین می کنیم. برای نمایش مشخص تر const ها آنها را با حروف تماماً بزرگ نمایش داده و برای جدا کردن کلمات از _ استفاده کنیم.
» حال کد مربوط به متد initializeUi در کلاس AndroidCourseActivity.java را به شکل زیر تغییر دهید.
 

کد:
01    private void initializeUi() ..
02        btn = (Button) findViewById(R.id.btn_action);
03        text = (TextView) findViewById(R.id.txt_caption);
04    
05        btn.setOnClickListener(new OnClickListener() ..
06    
07            @Override
08            public void onClick(View v) ..
09                Vehicle myVehicle = new Vehicle(200f, 800);
10                myVehicle.turnOn();
11                myVehicle.startMove();
12                myVehicle.turnOff();
13    
14                myVehicle.mPositionX = 10;
15                myVehicle.setType(Vehicle.TYPE_CAR);
16    
17                /* it's wrong code */
18                //String str = Vehicle.DEBUG_TAG;
19    
20                Log.i("LOG", "My Vehicle Type is: " + myVehicle.getType());
21            }
22        });
23    }

خط 15: با استفاده از ثابت TYPE_CAR مقدار mType را set می کنیم
خط 18: این مقدار خواندن نخواهد بود چرا که با توجه به تعریف آن در کلاس Vehicle از private visibility تبعیت می کند.

با توجه به مثال بالا می توانیم در مورد final و static بیشتر صحبت کنیم. به کلمات static, final, private, public, protected اصطلاحاً modifiers می گوییم.


Modifiers * :

static modifier :
با استفاده از آن باید به یک Field یا Method مستقیماً از طریق نام کلاس دسترسی پیدا کرد نه از طریق instance گرفته شده از کلاس یعنی می نویسیم Vehicle.TYPE_CAR و نمی نویسیم myVehicle.TYPE_CAR. با توجه به نوشته فوق مشخص است که حتی اگر instance ـی هم از آن کلاس نساخته باشیم، آن member ( فیلد یا متد ) قابل استفاده خواهد بود. این موضوع در جاهای متفاوتی به ما کمک می کند. فرض کنید که می خواهیم تعداد Vehicle های ساخته شده را در جایی ذخیره کنیم، دقیقا مانند این که بخواهیم بگوییم « از این نوع وسیله نقلیه چند تا داریم ». برای بیان جمله قبل نیازی به ساخت حتی یک نمون وسیله نقلیه هم نیست. بنابراین می توانیم در کلاس Vehicle بنویسیم:
 

کد:
01    public static int           mVehicleCount  = 0;

و برای تغییر آن ( اضافه کردن به آن ) می توانیم به صورت زیر ( مثلا در متد initializeUi ) بنویسیم:

کد:
01    Vehicle.mVehicleCount++;

اگر از static قبل از نام متد استفاده کنیم، همانطور که می توانستیم به فیلد را مستقیماً از نام کلاس دسترسی داشته باشیم، می تواینم به متد هم مستقیم دسترسی داشته باشیم، این موضوع هم شبیه این است که بگوییم « این نوع وسیله نقلیه چگونه سوخت گیری می کند »، برای بیان عبارت قبل هم نیازی به ساخت یک نمونه از وسیله نقلیه ندارم.
اینگونه متدهای استاتیک معمولاً Helper نامیده می شوند و کاربردهای مستقل از instance دارند. بطور مثال ممکن است متدی بخواهیم که یک عدد تصادفی تولید کند. می توان این متد را داخل کلاسی به نام MathHelpers تعریف کرد و هر جای دیگر با دستور MathHelper.getRandom آنرا فراخواند.
final modifier :
با استفاده از آن می توان به java compiler و eclipse فهماند که این member ( فیلد یا متد ) پس از تعریف اولیه مجدداً قابل تعریف نیست.

اگر این modifier قبل از نام فیلد استفاده شود به معنی این است که فیلد قابل مقداردهی مجدد نیست پس در همان خط باید مقدار دهی شود.
اگر قبل از نام پارامتر استفاده شود به معنی این است که نمی توان پارامتر را دوباره تغییر داد و فقط به منظور خوانده شدن استفاده می شود.
اگر قبل از نام متد استفاده شود به معنی این است که نمی توان متد را Override ( که بعداً توضیح می دهیم ) کرد.
اگر قبل از نام کلاس استفاده شود به معنی آن است که نمی توان از کلاس، subclass ـی تهیه کرد.
اگر به همراه static قبل از نام فیلد بکار رود به معنی تعریف یک ثابت است.
بنابراین بیشتر کاربرد final برای امنیت و کم کردن خطای برنامه نویس ( برنامه نویسان ) است.
private modifier :
مورد استفاده شده فقط در داخل کلاس قابل دید است و خارج از کلاس قابل دیدن نیست. این موضوع عملیات داخل کلاس را که معمولاً خیلی شلوغ و پر متغیر است را به بیرون انتقال نداده و باعث تمیز شدن کد و راحتی استفاده از کلاس می گردد.

protected modifier :
مورد استفاده شده فقط در داخل کلاس و زیر کلاسهای آن قابل دید است و خارج از آنها قابل دید نیست. این موضوع هم به تمیز بودن کد کمک شایانی می کند.

public modifier :
مورد استفاده شده در همه کلاسها قابل دید است. توصیه می شود از این modifier در مکان صحیح استفاده کنید و اگر واقعاً دید در همه کلاسها لازم نیست از آن استفاده نکنید.

default modifier :
اگر هیچ کدام از private, protected, public قبل از نام فیلد یا متد استفاده نشود از default modifier استفاده شده است و معنی آن اینست که مورد استفاده فقط در کلاسهایی قابل دید است که در یک package قرار داشته باشند. این modifier هم برای نوشتن module ها بسیار کاربرد دارد. جدول زیر نمای واضحتری را نشان می دهد.







 


مفهوم this: 

همانطور که در بحث کلاس اشاره شد، برای دسترسی به متدها و فیلدهای غیر استاتیک یک کلاس نیاز به ساخت یک نمونه ( instance ) از آن کلاس داریم. با استفاده از این instance و operator نقطه ( . ) می توانیم به متدها و فیلدهای public ( و بعضاً protected ) دسترسی پیدا کنیم. حال عبارت this چه کمکی به ما می کند. اگر داخل متدهای غیر استاتیک از کلمه this استفاده شود به آن instance ـی که این متد را فراخوانی کرده اشاره می کند، پس می توانیم آنرا به سایر متدها بصورت یک پارامتر از جنس همان کلاس انتقال دهیم. انتقال دادن آن به سایر متدهای غیر استاتیک آن کلاس کار بیهوده ای است چون آنجا هم خود this معنی دارد، اما انتقال دادن آن به متدهای استاتیک همان کلاس و مخصوصاً به متدهای استاتیک و یا غیراستاتیک سایر کلاسها کاملاً مرسوم و کاربردی است.

» کد زیر را به کلاس Vehicle.java بعد از startMove اضافه کنید:
 

کد:
01    public void sendNetworkData() ..
02        Log.i(DEBUG_TAG, "Vehicle Networking");
03        NetworkManager.sendVehicle(this);
04    }

» همینطور کلاس NetworkManager زیر را به نحوی که قبلاً گفته شده در com.uncocoder.course.lessons بوجود آورید و آنرا به شکل زیر edit کنید:
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    public class NetworkManager ..
04    
05        public static void sendVehicle(Vehicle vehicle) ..
06            if (vehicle != null) ..
07                /* do some action with vehicle data 
08                 * and send it through network
09                 */
10            }
11        }
12    }

با دیدن دو کد بالا می توان مفهوم this را به خوبی درک کرد.


سورس برنامه:

می توانید سورس را از آدرس زیر دانلود کنید:

 


توصیه ها:

- اگر با مفاهیم شیء گرایی ( Object Oriented * ) آشنایی لازم را ندارید بهتر است کتابی در مورد java تهیه و مطالعه کنید، با اینکه در این آموزشها با آن خواهیم پرداخت، اما مطالعه شما بهتر است.
- با همین مفاهیم اولیه در مورد شیء گرایی بسیار تمرین کنید و خود را در این مفاهیم قوی کنید تا در آموزشهای آتی بسیار راحتتر عمل کنید.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

جمعه 3 بهمن 1393  1:58 AM
تشکرات از این پست
ria1365
ria1365
کاربر طلایی1
تاریخ عضویت : مرداد 1389 
تعداد پست ها : 7868

پاسخ به:کلاس اموزش برنامه نویسی اندروید(دوره اول)

مقدمه: 

مهمترین علت وجودی Object Oriented مبحث میراث بری ( Inheritence * ) هست. به عبارتی هر کلاسی به غیر از کلاس Object مشتق شده از کلاس دیگری خواهد بود. بنابراین در صورتیکه SuperClass * برای یک کلاس تعریف نشود، همان کلاس Object مد نظر خواهد بود.
هر کلاس خواص public و protected کلاس بالادستی خود را دارا خواهد بود به علاوه اینکه می تواند دارای خواص دیگر منحصر به فردی باشد که باز هم ممکن است این خواص را به SubClass های خود بدهد یا ندهد. به طور مثال در مورد کلاس وسایل نقلیه ( Vehicle ) می توان عناصر mPosition, mType, mSpeed, ... را جزء خواصی دانست که همه Vehicle ها از جمله Car, Boat, Airplane آنرا تعریف می کنند. اما کلاس Boat دارای المان دیگری مانند « لنگر » خواهد بود که Car و Airplane آنرا ندارند. کلاس Boat هم می تواند دارای زیر کلاسهای دیگری باشد که همه آنها « لنگر » را تعریف کنند، حال اگر « لنگر » به عنوان private تعریف شده باشد، با اینکه در زیر کلاس Boat به آن دسترسی وجود ندارد اما داخل زیر کلاس Boat خواهد بود.


آموزش:
برای محدود کردن میراث بری کلاسها از modifier های public, private, protected, default که در قسمت قبل توضیح داده شد بسیار استفاده می کنیم. فرض کنیم می خواهیم دیاگرام زیر را که به آن Class Hierachy * می گویند با استفاده از برنامه نویسی بوجود آوریم.

کلاسهای زیر را مشاهده کنید، سورس کلاسها نسبت به قسمت قبل تغییر یافته است و چند کلاس هم اضافه شده است. این کلاسها کاربرد صحیحی در عمل ندارند و به مقاصد آموزشی اینگونه طراحی شده اند ولی نزدیک به ماهیت هر کلاس. توجه کنید که برای مفهوم تر شدن کدها کلاسها به package دیگری انتقال یافتند. برای اینکار می توانید بر روی src در پروژه خود Right-Click کرده و New->Package را انتخاب کنید و بنویسید com.uncocoder.course.lessons.sample1 ، با اینکار یک package جدید ساخته می شود. حالا می تواند با Drag & Drop موس ، Class های خود را به این Package انتقال دهید.


کلاس Vehicle:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    import android.util.Log;
04    import com.uncocoder.course.lessons.NetworkManager;
05    
06    public class Vehicle ..
07    
08        public final static int TYPE_UNDEFINED = 0;
09        public final static int TYPE_CAR       = 1;
10        public final static int TYPE_BOAT      = 2;
11        public final static int TYPE_AIRPLANE  = 3;
12    
13        public static int       mVehicleCount  = 0;
14    
15        public int              mWeight        = 0;
16        public float            mSpeed         = 0;
17    
18        protected int           mType          = 0;
19    
20    
21    
22        public Vehicle() ..
23            Vehicle.mVehicleCount++;
24        }
25    
26    
27    
28        public Vehicle(float speed, int weight) ..
29            Log.i("LOG", "Vehicle Created with Speed: " + speed + ", Weight: " + weight);
30            mSpeed = speed;
31            mWeight = weight;
32            Vehicle.mVehicleCount++;
33        }
34    
35    
36    
37        public void setType(int type) ..
38            if (type == TYPE_CAR) ..
39                Log.i("LOG", "Vehicle is Car");
40    
41            } else if (type == TYPE_BOAT) ..
42                Log.i("LOG", "Vehicle is Boat");
43    
44            } else if (type == TYPE_AIRPLANE) ..
45                Log.i("LOG", "Vehicle is Airplane");
46    
47            } else if (type == TYPE_UNDEFINED) ..
48                Log.i("LOG", "Type Undefined, Define a Valid Type");
49                return;
50    
51            } else ..
52                Log.i("LOG", "Use Const Values to Define a Type");
53                return;
54            }
55    
56            mType = type;
57            Log.i("LOG", "Vehicle Type Set!");
58        }
59    
60    
61    
62        public int getType() ..
63            Log.i("LOG", "Vehicle Type is: " + mType);
64            return mType;
65        }
66    
67    
68    
69        public void turnOn() ..
70            Log.i("LOG", "Vehicle Turned On");
71        }
72    
73    
74    
75        public void turnOff() ..
76            Log.i("LOG", "Vehicle Turned Off");
77        }
78    
79    
80    
81        public void startMove() ..
82            Log.i("LOG", "Vehicle Starts Moving");
83        }
84    
85    
86    
87        public void sendNetworkData() ..
88            Log.i("LOG", "Vehicle Networking");
89            NetworkManager.sendVehicle(this);
90        }
91    }

خط 8 تا 11 : تعدادی ثابت به منظور مشخص کردن تایپ هر کلاس تعیین شده است. تایپ کلاس کمک می کنه که به راحتی نوع اشیاء را مورد بررسی قرار دهیم. البته راههای دیگری نیز وجود دارد ولی فعلاً به این روش بسنده می کنیم
خط 13 : یک static به منظور نگه داشتن تعداد Vehicle های ساخته شده تعریف کرده ایم. همانطور که در خطوط 23 و 32 مشخص است به این مقدار یکی اضافه می کنیم. چون برای ساختن یک Vehicle حتماً از یکی از Constructor ها باید استفاده شود.
خط 15و 16: دو فیلد public تعریف شده اند که از هر کلاسی می توان به آنها دسترسی پیدا کرد.
خط 18: یک فیلد protected تعریف شده است بنابراین از این کلاس و سایر subclass های این کلاس می توان به آن دسترسی پیدا کرد.
خط 22: یک Constructor بدون ورودی تعریف شده است
خط 28: یک Constructor با دو ورودی تعریف شده است که ابتدا پیغامی چاپ می کند و سپس مقادیر دو فیلد public را مقدار دهی می کند.
خط 37: یک Setter برای mType تعریف شده است چرا که mType فقط از زیرکلاسها قابل دسترسی است و با اینکار setType که public است از همه جا قابل دسترسی است. اما قبل از Set کردن مقدار mType پیغامهای مناسب خارج می کند
خط 62: یک Getter برای mType تعریف شده است. با توجه به تعریف Setter و Getter برای mType پس Encapsulate شده است. با استفاده از Getter مقدار متغیر mType که protected است را می توان از هر کلاسی خواند چرا که Getter بصورت public تعریف شده است
خط 69 تا 90: تعدادی متد تعریف شده اند که همه public هستند و از هر کلاسی قابل دسترسی هستند.


کلاس Car:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    
04    public class Car extends Vehicle ..
05    
06        public int mWheelsCount = 4;
07    
08    
09    
10        public Car() ..
11            mType = Vehicle.TYPE_CAR;
12        }
13    }

خط 4: کلاس Car از Vehicle گرفته شده است و می گوییم Car یک Vehicle است. در اینصورت تمامی Field ها، Method ها، و ... به Car به ارث می رسد چه public باشند چه protected، اما خواص private فقط برای همان کلاس حفظ خواهد شد و به زیر کلاسها به ارث نخواهد رسید.
خط 6: علاوه بر member های موجود در Vehicle می خواهیم بک فیلد جدید تعریف کنیم که تعداد چرخهای یک ماشین را در بر گیرد. چرا که هر زیر کلاسی از Vehicle به آن نیاز ندارد اما زیر کلاس Car به آن نیاز دارد.
خط 10: با تعریف یک Constructor بدون ورودی، Constructor پیش فرض کلاس Car را تعریف می کنیم تا عمل خاصی ( که اختصاص یک Type صحیح است ) را انجام دهیم. فیلد mType در کلاس Vehicle تعریف شده است اما چون در Car به ارث رسیده قابل استفاده است. با اختصاص ثابت موجود در Vehicle تعریف می کنیم که Type این کلاس TYPE_CAR است. بجای Type از هر عبارت دیگری می توان استفاده کرد و Type یک کلمه کلیدی خاص نیست. همینطور دقت داشته باشید که با اجرای Constructor در زیر کلاس ها Constructor ساده ( بدون ورودی ) در کلاسهای super هم اجرا خواهد شد. برای تست اجرا شدن Constructor ها و بررسی متد ها می توانید با بررسی Log ها قضیه را بهتر متوجه شوید.


کلاس Formula:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    
04    public class Formula extends Car ..
05    
06    }

از کلاس Car میراث بری کرده است پس علاوه بر میراث برای از Vehicle که superclass کلاس Car است ، Member های کلاس Car یعنی mWheelCount را هم به ارث خواهد برد. از طرف دیگر هیچ Constructor ـی برای آن تعریف نشده و همچنان Constructor پیش فرض آن عمل می کند. از آنجاییکه Constructor اصلی کلاس Car هم باید اجرا شود پس بطور اتوماتیک تایپ Formula هم TYPE_CAR خواهد شد. سپس Constructor اصلی Vehicle اجرا خواهد شد و یک عدد به Vehicle ها اضافه می شود.


کلاس Truck:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    public class Truck extends Car ..
04    
05        public Truck() ..
06            mWheelsCount = 18;
07        }
08    }

کلاس Truck هم زیر کلاسی از Car است و Constructor اصلی آن تعریف شده است. پس به علاوه انجام عمل در این Constructor یعنی Set کردن تعداد چرخها با عدد 18 به Constructor اصلی Car و سپس Vehicle می رود و باقی آن نتیجه ای مانند Formula در پس خواهد داشت.


کلاس Boat:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    import android.util.Log;
04    
05    public class Boat extends Vehicle ..
06    
07        public Boat() ..
08            mType = Vehicle.TYPE_BOAT;
09        }
10    
11    
12    
13        @Override
14        public void startMove() ..
15            Log.i("LOG", "Boat Moving");
16            super.startMove();
17        }
18    
19    
20    
21        @Override
22        public void turnOn() ..
23            Log.i("LOG", "No Need to Turn On");
24        }
25    
26    
27    
28        @Override
29        public void turnOff() ..
30            Log.i("LOG", "No Need to Turn Off");
31        }
32    
33    
34    
35        @Override
36        public int getType() ..
37            Log.i("LOG", "Another Pass for getType");
38            return super.getType();
39        }
40    }

خط 8: که داخل Constructor اصلی قرار دارد باعث Set شدن مقدار mType با TYPE_BOAT می شود.
خط 13 تا خط 39: متدهای موجود در Vehicle اصطلاحاً Override خواهند شد. با Override کردن یک متد، آن متد دیگر اجرا نمی شود. به طور مثال اگر متد startMove در این کلاس تعریف نشده بود به علت میراث برای، متد startMove داخل Vehicle اجرا می شود اما با Override کردن آن دیگر متد داخل Vehicle اجرا نخواهد شد. چنانچه تمایل داشتیم علاوه بر کارهای جدید موجود در این متد، متد موجود در کلاس superclass کلاس Boat هم اجرا شود می توانیم از super استفاده کنیم. با این کار دستور می دهیم که متد startMove کلاس Vehicle که super کلاس Boat هست هم اجرا شود. همینطور در خط 38 هم دوباره درخواست اجرای متد درون Vehicle را داده ایم با این تفاوت که این متد خروجی هم دارد پس اگر تمایل داشته باشیم می توانیم مانند کدی که نوشته شده خروجی superclass را به عنوان خروجی این متد در نظر بگیریم.
در خطوط 22 و 29: چون متدها Override شده اند و از super برای فراخوانی متدهای داخل superclass استفاده نشده است پس دیگر متدهای همسان superclass اجرا نخواهند شد.


کلاس Airplane:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    public class Airplane extends Vehicle ..
04    
05        public final static int FLYTYPE_NA         = 0;
06        public final static int FLYTYPE_MOTOR      = 1;
07        public final static int FLYTYPE_MECHANICAL = 2;
08    
09        protected int           mFlyType           = Airplane.FLYTYPE_NA;
10    
11    
12    
13        public Airplane() ..
14            mType = Vehicle.TYPE_AIRPLANE;
15        }
16    }

خط 5 تا 7: علاوه بر میراث بری از کلاس Vehicle تعدادی ثابت هم در این کلاس به صورت public تعریف شده اند بنابراین با استفاده از Airplane.FLYTYPE قابل استفاده خواهند بود.
خط 9: یک فیلد protected با مقدار پیش فرض 0 تعریف شده چرا که FLYTYPE_NA مقدار 0 را در بر دارد.
خط 13: Constructor اصلی تعریف شده و مقدار Type در آن Set می شود.


کلاس Glider:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    public class Glider extends Airplane ..
04    
05        public Glider() ..
06            mFlyType = Airplane.FLYTYPE_MECHANICAL;
07        }
08    }

یک Airplane است ( از کلاس Airplane میراث بری کرده است ، زیر کلاس Airplane است ) پس خواص آن مثلا mFlyType تعریف شده که در خط 6 با استفاده از ثابت های تعریف شده در Airplane مقدار دهی می شود.


کلاس Jet:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    public class Jet extends Airplane ..
04    
05        public Jet() ..
06            mFlyType = Airplane.FLYTYPE_MOTOR;
07        }
08    }

مانند کلاس Glider با تفاوت اینکه نوع mFlyType آن چیز دیگری متفاوت از Glider تعریف شده است.


حالا طریقه استفاده و ساخت نمونه ای از این کلاسها در چند خط به نمایش در آمده که مفهوم ساده ای در بر دارد. بنابراین آنرا در کلاس AndroidCourseActivity با سورس زیر می توانیم تست کنیم:
 

کد:
01    package com.uncocoder.course.lessons;
02    
03    import android.app.Activity;
04    import android.os.Bundle;
05    import android.view.View;
06    import android.view.View.OnClickListener;
07    import android.widget.Button;
08    import android.widget.TextView;
09    import com.uncocoder.course.lessons.sample1.Car;
10    import com.uncocoder.course.lessons.sample1.Formula;
11    import com.uncocoder.course.lessons.sample1.Glider;
12    import com.uncocoder.course.lessons.sample1.Truck;
13    import com.uncocoder.course.lessons.sample1.Vehicle;
14    
15    public class AndroidCourseActivity extends Activity ..
16    
17        private Button   btn  = null;
18        private TextView text = null;
19    
20    
21    
22        /** Called when the activity is first created. */
23        @Override
24        public void onCreate(Bundle savedInstanceState) ..
25            super.onCreate(savedInstanceState);
26            setContentView(R.layout.main);
27    
28            initializeUi();
29        }
30    
31    
32    
33        private void initializeUi() ..
34            btn = (Button) findViewById(R.id.btn_action);
35            text = (TextView) findViewById(R.id.txt_caption);
36    
37            btn.setOnClickListener(new OnClickListener() ..
38    
39                @Override
40                public void onClick(View v) ..
41    
42                    Vehicle vehicle1 = new Vehicle();
43                    Vehicle vehicle2 = new Vehicle(10.0f, 1);
44                    Car car = new Car();
45    
46                    Formula formula1 = new Formula();
47                    formula1.turnOff();
48                    formula1.turnOn();
49    
50                    Glider glider = new Glider();
51                    Truck truck = new Truck();
52                }
53            });
54        }
55    }

خطوط 42 تا 51: توجه کنید که تعریف شدن یک نمونه Formula هیچ ارتباطی به تعریف شدن Car یا Vehicle ها ندارد بلکه کاملاً مستقل است. همینطور میراث برای برای instance ها وجود دارد و مثلا formula به متدهای تعریف شده در Vehicle مثل turnOn و turnOff دسترسی دارد.
این بود کلیات میراث بری. البته نکات ظریفتری هم وجود دارد که فعلاً دانستن آن برای ما زود است.


Nested Class:
اگر مفهوم Class ها را خوب متوجه شده باشید، Nested Class را هم خوب متوجه خواهید شد. این کلاسهای چیزی نیستند جز اینکه در کلاس دیگری تعریف می شوند و دسترسی به آنها با صدا کردن دو کلاس یا چند کلاس پشت سر هم امکان پذیر است. به مثال زیر که تکمیل شده کلاس Airplane است توجه کنید:
 

کد:
01    package com.uncocoder.course.lessons.sample1;
02    
03    import android.util.Log;
04    
05    public class Airplane extends Vehicle ..
06    
07        public final static int FLYTYPE_NA         = 0;
08        public final static int FLYTYPE_MOTOR      = 1;
09        public final static int FLYTYPE_MECHANICAL = 2;
10    
11        protected int           mFlyType           = Airplane.FLYTYPE_NA;
12    
13    
14    
15        public Airplane() ..
16            mType = Vehicle.TYPE_AIRPLANE;
17        }
18    
19        public static class Engine ..
20    
21            public int mRpm = 10000;
22    
23    
24    
25            public Engine() ..
26                Log.i("LOG", "Engine Created");
27            }
28        }
29    }

خط 20: یک Nested Class جدید داخل Airplane تعریف می شود. به این دلیل static تعریف شده که با استفاده از Airplane.Engine بتوان به آن دسترسی داشت. به دلیل اینکه از چیزی میراث برای نکرده است پس فقط از کلاس Object میراث بری کرده است. توجه داشته باشید که وجود آن در کلاس Airplane به معنی میراث بری از Airplane نیست بلکه اصطلاحاً در آن Namespace تعریف شده است.
خط 22: مانند هر کلاس دیگری می تواند ویژگیهای خاص خود را دارا باشد پس یک فیلد برای نمونه با آن اضافه کردیم.
خط 26: مانند هر کلاس دیگری که می تواند دارای Constructor باشد آنهم Constructor دارد.
پس تفاوتی بین ماهیت Class, Nested Class نیست بلکه نوع دسترسی به آن و مکان تعریف شدن آن، این نام را برای آن برگزیده است.
برای ساخت یک نمونه Nested Class مانند زیر عمل می کنیم.
 

کد:
01                    Airplane.Engine engine = new Airplane.Engine();

سورس برنامه:
می توانید سورس را از آدرس زیر دانلود کنید:

 


توصیه ها:
- آنقدر با شیء گرایی دست و پنجه نرم کنید که به آن مسلط شوید تا به شما در آینده کمک های زیادی کند.
- شما دیگر نباید در نوشتن الگوریتم های معمولی مشکلی داشته باشید و اگر هنوز مشکلی در این زمینه وجود دارد انواع مثالهای دانشجویی را از اینترنت مطالعه کنید و با فکر خودتان و سرعت عمل زیادتان در تایپ و برنامه نویسی، آنها را حل کنید.

     Android iOS , Windowsphone , Symbian , JavaMobile Review ,Learning

جمعه 3 بهمن 1393  2:03 AM
تشکرات از این پست
دسترسی سریع به انجمن ها