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

1396/7/19 ستاره مقاری 5220

با سلام. با یکی دیگه از جلسات آموزش اندروید در خدمتتون هستم.

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

این جلسه طبق روال چند جلسه قبل یکی دو نکته از جاوا رو خواهیم داشت و بعد از آن دوباره وارد مبحث اندروید میشویم.

از چند جلسه بعد سبک درس دادن کمی تغییر خواهد کرد چون مقدمات کار را خواهید آموخت. و کم کم با تعریف یک پروژه سعی خواهیم کرد که آموزش­ها بصورت عملی پیاده شود.

خب یک نکته کوچیک از جاوا میگم. پروژه جاوا باز کنید یا اگر از قبل دارید قبلی را بیارید.

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

اما همیشه اینطور نیست. گاها رفتارهایی به اشیا و موجوداتی نسبت داده میشود که نیاز به نمونه گرفتن ندارد.

مثلا فک کنید کلاسی دارم به اسم ریاضی. حالا میخواهم بگم ریاضی برای من سینوس بگیر. واقعا نمونه گرفتن لازم هست؟؟؟ مسلما اینطور نیست.

اینجور مواقع که نیازی به نمونه گرفتن نمیبینیم از واژه ی static استفاده میکنیم.

این واژه در مفهوم یعنی ایستا یعنی چیزی که ثابت هست.

به این معنی که برای صدا زدن متد ، نیازی به ساختن شی از کلاس نمی باشد و این متد مستقیما از روی کلاس صدا زده می شود :

خب بیاید مثال را عملی کنیم. مثلا یک کلاس بسازید به نام myMath (Math نگذاریدا!!!)

حالا توی کلاس یک تابع بسازید به اسم Sum که دوتا ورودی میگیرد. میخواهم این تابع دوتا ورودی صحیح داشته باشد و جمع آنها را برگرداند.

تا ایجا را که بلدید:

public class myMath {

    public int Sum(int Input1, int Input2){
        int TheSum = Input1+Input2;
   }
}


یک بررسی بکنیم. اول از همه public تعریفش کردم چون میخواهم از یک کلاس دیگری صدا بزنمش (که البته می­شد protected تعریف کنید چون از کلاس هم پکیجش باز هم قابل خوندن خواهد بود).

مورد بعدی int هست به معنای عدد صحیح که همانطور که یادتون دادم در تعریف توابع در این قسمت نوع خروجی را مشخص میکنیم.

بعد از آن Sum را آوردم که نام تابعم هست.

سپس داخل پرانتز دوتا ورودی را مشخص کردم. و تعیین کردم دوتا ورودی که به تابع فرستاده میشود باید نوعش int باشه و داخل تابع بخواهم با آنها کار کنم با اسم Input1 و Input2 صدا میزنمشان

بعد داخل تابع یک متغیر تعریف کردم به اسم TheSum که مقدار جمع ورودیها را داخلش ذخیره کردم.

خب ایراد میگیره ازتون! آخر تابع میبینید که یک خط قرمز کشیده شده. موس رو ببرید روش نوشته شده Missung Return

حالا Return چی هست و چرا تاحالا استفادش نکردیم. تا الان توابعی که نوشتیم هیچوقت خروجی نداشتن و از نوع void بودن. اندفعه تابعی نوشتیم که میخواهیم محاسبه کند و از هرجا که صدا زده شده به همانجا یک مقداری را برگرداند. برای برگرداندن مقدار توی توابع از return استفاده میکنیم. اینطوری:

return *some value*;

پس کلا کلاسمان تا اینجا میشود:

public class myMath {
    public int Sum(int Input1, int Input2){
        int TheSum = Input1+Input2;
        return TheSum;
   }
}

 

حالا برید یک کلاس دیگری بسازید و داخلش متد main بسازید (در کلاس قبلی هم میشد اما میخوام بیشتر درکش کنیدش)

اینبار میخوام دوتا عدد 4 و 5 را باهم جمع کنم و خروجی را چاپ کنم. پس دارم:

public class myClass {
    public static void main(String args[]){
        myMath m = new myMath();
        int result = m.Sum(4,5);
        System.out.print(result);
    }
}

مشخص هست از کلاس ریاضیم نمونه گرفتم، بعد تابعش را با دو ورودیه 4 و 5 صدا زدم.

خروجی برمیگرداند (return) که درجا در متغیری بنام result ذخیره کردم.

و در اخر چاپ کردم متغیرم را. که اگه از منوی بالا Run را بزنید میبینید خروجیش رو.

خب بنظر شما بی معنی نیست؟ هربار بیایم ازین کلاس نمونه بگیریم؟؟ مسلما کار جالبی نی!

اما چکار کنیم که جای نمونه گرفتن یک myMath.Sum که بزنیم قابل استفاده باشد؟ اگر الان این را بزنید میبینید که اصلا نمیخونه کد شما را.

برید داخل کلاس ریاضیتان و متدی که نوشتید را استاتیک کنید. اینطوری:

public static int Sum(int Input1, int Input2){

    int TheSum = Input1+Input2;
    return TheSum;
}

خب تمام. حالا برید توی اونیکی کلاس و خیلی راحت بصورت زیر متدتان را صدا بزنید:

int result =  myMath.Sum(4,5);
System.out.print(result);

این هم از مفهوام استاتیک برای توابع.

این مفهوم برای متغیرها هم صدق میکند. اما چطور و به چه معنا.

فک کنید در یک کلاسی یک متغیری دارید که توی کلاسهای مختلفی باید صدا بزنیدش و تغییرش بدید. خب هربار برای استفاده از متغیرتان باید بیاید از کلاستان نمونه بگیرید. اما این باعث میشود که خراب شود متغیرتان. یعنی چی؟ خب تست کنید.

متغیر زیر را در کلاس myMath تعریف کنید (توی خوده کلاس نه داخل متد)

public int MyInt;

حالا برید داخل کلاس دیگری که ساختید. بیاید یه تست کوچیک بگیریم. همینجا در main بیاید دوبار از کلاسمان نمونه بگیریم و متغیرمان را تغییر بدیم. ببینیم آیا تغییرات ما توی آن ذخیره میشود یا نه

myMath m = new myMath();
m.MyInt = 4;
System.out.print(m.MyInt + "\n");
myMath m2 = new myMath();
System.out.print(m2.MyInt);

خب اجرا بگیرید. این کد دقیقا عین این هست که توی دوتا کلاس مختلف بیاید از myMath نمونه بگیرید و فرقی ندارد. (علامت \n در عمل پرینت نقش enter زدن را دارد و عمل + در متن چاپی برای متصل کردن دوتا فرمان چاپ به هم دیگر استفاده میشود)

وقتی چاپ کنید میبینید که اولش متغیرتان همان 4 شده مقدارش اما بعدش که دوباره کلاس را نمونه گرفتید شده 0. که البته لازم به ذکر هست این صفر برای این است که مقدار int در جاوا وقتی متغیری از جنسش تعریف میکنید بصورت پیشفرض صفر در نظر گرفته میشود....

آموزش برنامه نویسی در اندروید

حالا چرا اینطوری شد؟ ..... خب اصلا واضح هم هست! این عین همین هست که بگید یک انسانی گشنه اش بوده و چیزی خورده یکی دیگه سیر شده! خنده دار هست. چون m و m2 دوتا موجوده جدا هستند. با یکی کار کنید نمیشه روی دیگری هم اجرا شود کارتون!

خب حالا تکلیف چی هست؟ چکار کنیم که یک متغیری از یک کلاسو بتونیم در طول برناممون هی استفادش کنیم؟ و تغییر هم نکند؟ و از هرجای برنامه و هر کلاسی که داریم مقدارشو تغییر دادیم داخلش ذخیره شود برای همه؟

*کافی هست static تعریفش کنید.*

public static int MyInt;

خب خودتان برید و تست کنیدش. مثلا در کلاسی که ساختید دوتا متد تعریف کنید. داخل یکی بیاید مقداره این متغیر را با استفاده از myMath.MyInt و بدون نمونه گرفتن مثلا بکنید 8.

در یک متد دیگه سه تا بهش اضافه کنید.

در آخر داخل main بیاید متدهاتونو فراخوانی کنید که عملیات را انجام بدهند و اخر هم چاپ کنید MyInt را. میبینید که مقدارها درست داخلش ذخیره شده.

خودتان تست کنید این رو تا مجبور شید دست به کد شید J چون من بگم احتمالا کسی انجام نخواهد داد K

خب کافی هست! بریم دوباره سراغ اندروید...

برنامه همیشگی مان را باز کنید. میخواهم یک سری نکته جدید راجع به دیزاین به شما بگم.

layout main را بیارید.

با دوتا layout اشنا شدید. همان linearLayout بگذارید باشه. میخواهم چنین دیزاینی باهاش انجام بدهم:

آموزش برنامه نویسی در اندروید

و البته با کد.

خب سه تا دکمه توی کد بگذارید پشت هم. مسلما چنین چیزی را نخواهید داشت! چون دکمه های شما زیر هم قرار میگیرند. چطوری بیایم این فاصله­های غیر یکسان را ایجاد کنیم؟

خب دوستان برای ایجاد فاصله بین ابزارها از margin استفاده میکنیم که میتواند از بالا یا پایین یا راست و چپ تعریف بشود. مقدار margin میتواند بر اساس px یا dp تعیین شود. مثل زیر:

android:layout_marginTop="190dp"

اما حالا چطوری؟ دکمه اولی رو که انداختید چطوری بیاد وسط؟

با gravity که اشنا شدید. کافیه بذاریدش روی center. بصورت زیر

آموزش برنامه نویسی در اندروید

خب برای دومی چطور؟ اول اینکه یکم از بالایی فاصله دارد. یکم هم از چپ صفحه.

کافی هست نسب به بالا margin بگیرد. همینطور بهش gravity بدم به سمت چپ صفحه و از چپ یکم هم margin بدهم. اینطوری:

آموزش برنامه نویسی در اندروید

و اما سومی. سمت راست هست و از بالایی یکم فاصله دارد. کدش رو دیگه باید حدس بزنید. اینطوری:

آموزش برنامه نویسی در اندروید

حالا مفهوم بعدی.

فک کنید من بخواهم از داخل ابزاری برایش فاصله ایجاد کنم! یعنی چی؟ دکمه زیری رو من چطوری بسازم:

آموزش برنامه نویسی در اندروید

  •  

با margin که اشنا شدید برای فاصله دادن از اطراف بود. حالا با padding اشنا شید!

برای فاصله دادن توی ابزارها کاربرد دارد. الان من میخواهم متن روی دکمم از سمت راست یک فاصله خاصی بگیرد مثلا. کافی هست یه آن padding راست بدهم.

همینطور بخواهم از پایین فاصله بگیرد.

پس کدم بصورت زیر هست:

android:paddingRight="40dp"
android:paddingBottom="70dp"

و حالا برای جلسه بعد. دیزاین زیر رو از شما میخواهم که بسازیدش:

آموزش برنامه نویسی در اندروید