زبان Java به صورت پیشفرض برای برنامه نویسی نرم افزارهای اندروید استفاده میشود. یادگیری این زبان برای کسی که تا کنون برنامه نویسی نکرده اند مشکل است، ولی اگر انگیزه کافی برای تبدیل شدن به یک برنامه نویس اندروید را دارید اصلا نگران نباشید.
در ابتدا قصد داریم طرز کار برنامههای اندروید را با هم بررسی کنیم. همانطور که در قسمت سوم آموزش اندروید گفتیم، Activityها فایلهای جداگانهای هستند که هر کدام وظیفهای معین را بر عهده دارند.
فرض کنید یک برنامه دارید که از شما نام افراد را گرفته، ذخیره و نمایش میدهد. در ضمن امکان ویرایش اطلاعات نیز وجود دارد. در این مثال برای سه فعالیت ذخیره اطلاعات کاربران، نمایش اطلاعات کاربران و ویرایش اطلاعات سه اکتیویتی باید ایجاد کنید.
اگر یک پروژه در Android Studio ایجاد کنید در مسیر app -> java نام پکیج برنامه خود را خوهید دید، پکیج یاد شده را باز کرده و در آن لیستی از Activityهای موجود را میبینید.
اگر نام Activiy خود را در حین ایجاد پروژه ویرایش نکرده باشید یک فایل با نام MainActivity خواهید دید. محتویات این فایل به شرح زیر است:
package hitos.ir.hitosapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
نکته: ممکن است در ادامه با اصطلاحاتی مواجه باشید که خیلی برایتان روشن نباشند، صبور باشید تا در آینده با آنها آشنا شوید.
- در سطر اول نام پکیجی که در حال برنامه نویسی در آن هستیم آمده است. در قسمت سوم گفتیم که نام Package متشکل از نام Company Domain و Application name است.
- در سطرهای سوم و چهارم دو کلاس مهم به فایل جاری اضافه شده اند تا در برنامه از این دو کلاس مهم استفاده کند.
- در سطر ششم، کلاس این Activity به نام MainActivity که public و extends شده از AppCompatActivity را میبینید. extends شدن به معنای ارث بری است (مطلب آشنایی با شی گرایی را از دست ندهید).
- در سطر 9 سورس فوق شاهد یک متد هستیم. نام این متد onCreate و protected میباشد و نوع آن void است.
- سطر 10 و 11 نیز دو متد هستند.
نکته: متدهای موجود در سطرهای 9 و 10 و 11 داخل پرانتز مقادیری دارند که به این مقادیر ورودیهای متد میگویند.
تشریح متد onCreate درسطر 9: این متد که onCreate نام دارد، بیان میکند هنگام صدا زدن این Activity محتویات درون این متد را اجرا کن.
تشریح متد setContentView در سطر 11: اگر به اطلاعات درون پرانتز مقابل setContentView دقت کنید سورس R.layout.activity_main
را میبینید. R اول به معنای مراجعه به پوشه res، عبارت layout به معنای مراجعه به پوشه layout و activity_main نام لایهای است که باید اجرا شود. بنابراین متد setContentView برای شما لایه نمایشی activity_main را نمایش میدهد.
نکته: توجه کنید اطلاعات با براکت دسته بندی میشوند، مثلا در کلاس MainActivity یک براکت شروع میشود که تا آخرین سطر ادامه دارد و تمام دستورات باید درون این براکت قرار گیرند. متد onCreate هم به این شکل است و کلیه دستورات مربوط به این متد باید درون براکت قرار گیرند.
نمایش پیامهای Toast در اندروید
پیامهای Toast نوعی پیام هستند که چند لحظه ظاهر شده و سپس محو میشوند. مانند زیر:
برای ایجاد پیام فوق یک خط پس از متد setContentView تایپ کنید Toast، در حین تایپ این عبارت کادری مانند زیر ظاهر میشود:
که از شما در خواست میکند کلاس مخصوص نمایش Toastها را به پروژه خود اضافه کنید، که روی عبارت Toast (android.widget)
کلیک کنید.
در بالای کدهای خود کلاس import android.widget.Toast;
را خواهید دید.
متد Toast را به شکل زیر کامل کنید:
Toast.makeText(this, "Hitos message", Toast.LENGTH_LONG);
عبارات داخل پرانتز مقابل Toast.makeText در واقع پارامترهای ورودی متد Toast هستند و از آنها برای ساخت پیام استفاده میشود. این پارامترها با ویرگول تفکیک میشوند. پارامتر اول this نشان دهنده context است که در ادامه به آن میپردازیم. پارامتر دوم که در مثال بالا "Hitos message"
است در واقع پیام نمایش داده شده به کاربر است. پارامتر Toast.LENGTH_LONG به این معناست که پیام روی صفحه به مدت طولانی نمایش داده شود، اگر از Toast.LENGTH_SHORT استفاده کنید، پیام به مدت کوتاه تری در صفحه باقی میماند.
نکته: توجه کنید سورس ذکر شده در بالا باید درون براکتهای متد onCreate قرار گیرد. مانند:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "Hitos message", Toast.LENGTH_LONG).show();
}
متغیرها در زبان Java
متغیرها ظرفهایی هستند که قرار است اطلاع مناسب را در خود ذخیره کنند. اگر مباحث ریاضی دوران مدرسه خود را به خاطر دارید حتما یادتان هست که اعداد به صورت صحیح و اعشاری تقسیم میشد، در برنامه نویسی نیز اعداد و کاراکترها به انواع مختلفی تقسیم میشود:
- int: این متغیر برای مشخص کردن اعداد صحیح استفاده میشود.
- double: این متغیر برای مشخص کردن اعداد اعشاری مورد استفاده قرار میگیرد.
- String: برای مشخص حروف الفبا و عبارات مخلوط عدد و حروف.
- boolean: برای مشخص کردن یکی از دو حالت true و یا false.
- char: برای مشخص کردن تنها یک کاراکتر.
نکته: البته انواع داده دیگری مانند byte (برای اعداد منفی 128 تا مثبت 127)، short (برای ذخیره اعداد منفی 32786 تا مثبت 32767)، long برای ذخیره اعداد بسیار بزرگ، float برای معرفی کردن اعداد اعشاری کوتاه تر از double است که در نهایت اعداد اعشاری باید کاراکتر f را بگذاریم.
توجه کنید متغیرها باید درون بلاک کلاس درج شود:
public class MainActivity extends AppCompatActivity {
int age = 26;
String name = "hitos";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, name, Toast.LENGTH_LONG);
}
}
- در سطر دوم یک متغیر با نام age ایجاد کردیم که در آن یک عدد ذخیره کردیم.
- در سطر سوم یک متغیر با نام name ایجاد کردیم که در آن یک نام ذخیره کردیم.
- در سطر هشتم و درون پرانتز متد Toast، به جای پیامی که بین علامت نقل قول میگذاشتیم متغیر name را درج کردیم.
اگر کدهای پیش فرض کلاس را به صورت بالا در آورید، خواهید دید پیامی حاوی hitos روی صفحه ماشین مجازی چاپ خواهد شد.
نکته: همیشه باید دقت کنید، استفاده از متغیر باید پس از تعریف آن باشد، و اول متغیر را تعریف و در پایین آن از آن استفاده میکنیم.
قوانین نام گذاری متغیرها:
- متغیر فقط از اعداد و حروف انگلیسی تشکیل میشود.
- در نام متغیر میتوان از اندرلاین استفاده کرد.
- نام متغیر نباید با عدد شروع شود و تنها میتوان آن را با حرف و یا اندرلاین شروع کرد.
- نام متغیر به بزرگ و کوچک بودن حروف حساس است و یا به عبارتی متغیرهای name و Name با هم تفاوت دارند.
تنها یک بار نیاز به اعلام نوع متغیر داریم، و در دفعات بعدی دیگر نیازی به اعلام نوع متغیر نیست. مانند:
String name= "mahdi";
name= "hasan";
Toast.makeText(this, name, Toast.LENGTH_LONG).show();
اگر دستورات فوق را درون متد onCreate جایگذاری کنید، به نظرتان چه چیزی در خروجی چاپ میشود؟
نکته: انتخاب نوع متغیر مهم است، مثلا نمیتوان در Toast و در بخش پیام، از یک متغیر عددی استفاده کرد. برای استفاده از متغیر عددی در بخشی که نیازمند متغیر متنی و رشتهای است مانند زیر عمل میکنیم:
int age= 30;
Toast.makeText(this, "" + age, Toast.LENGTH_LONG).show();
با اضافه کردن عبارت "" +
قبل از متغیر عددی میتوانیم از آن استفاده کنیم. اگر این عبارت را قبل از متغیر عددی قرار ندهیم، اجرای برنامه با خطا مواجه میشود.
نکته: نمیتوان یک متغیر را دوبار تعریف کرد، و کد زیر اجرا نخواهد شد:
int age = 5;
int age = 3;
LogCat چیست و چگونه از آن استفاده کنیم؟
در هر سیستم پیشرفتهای عملکرد نرم افزارها در مکانی به نام LOG ذخیره میشود. این LOGها برای بررسی عملکرد سیستم و خطایابی بسیار حیاتی هستند.
فرایند خطایابی در هر سیستمی بسیار حیاتی است، و تقریبا هیچ نرم افزاری ساخته نمیشود مگر این که در حین پیاده سازی دهها خطا داشته باشد. یافتن خطا فرایند رفع عیب آن را بسیار ساده میکند.
در اندروید با ابزاری به نام LogCat میتوان به عملکرد نرم افزارها پی برد و اگر خطایی منجر به متوقف شدن اجرای نرم افزار شد آن را به سادگی رصد کرد.
طرز عملکرد LogCat ساده است و تنها کافی است درون Activity و مثلا درون متد onCreate متد Log را به شکل زیر پیاده سازی کنیم:
Log.i("Log Name", "Log from Hitos.ir");
وقتی این عبارت را وارد کنید، یک بالن کوچک بالای Log ظاهر میشود، مانند زیر:
با موس روی عبارت Log کلیک کرده و کلیدهای ترکیبی ALT + Enter را فشار دهید، اگر خوب دقت کنید به لیست کلاسهای Import شده در بالا یک کلاس دیگر به نام import android.util.Log
اضافه میگردد.
نرم افزار خود را اجرا کرده و به برگه Android Monitor در نوار پایین محیط توسعه خود مراجعه کنید.
در برگه logcat هشدارها و پیامهای logcat را مشاهده میکنید و در برگه Monitors میزان مصرف رم، پردازنده، شبکه و پردازنده گرافیکی را میتوانید ببینید:
همانطور که در بالا میبینید پیامی که به متد Log دادیم به نمایش در میآمد.
متد Log ورودیهای متنوعی دارد. درون پرانتز دو رشته دادیم که آنها را با ویرگول جدا کردیم، رشته اول عنوان log و دومی متن توضیحی است. کاراکتر i که پس از Log میآید نیز مشخص کننده سطح Logای است که در این سیستم ذخیره خواهد شد. i خلاصه شده، information است که Logها سطوح دیگری نیز دارند که به شرح زیر هستند:
d: به معنای ثبت لاگ در سطح Debug است.
w: به معنای ثبت لاگ در سطح Warning است.
e: به معنای سطح Error.
سورس کد زیر را به منظور مشاهده انواع Log در کلاس Activity با متد onCreate جایگزین کنید:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("Log Info", "Log from Hitos.ir");
Log.d("Log Debug", "Log from Hitos.ir");
Log.w("Log Warning", "Log from Hitos.ir");
Log.e("Log Error", "Log from Hitos.ir");
}
نتیجه اجرای این سورس در بخش Logcat اندروید استودیو به شرح زیر است:
نکته: در بالای پنجره logcat باکسی برای جستجوی متن موجود در logcatها و یا انتخاب نوع log موجود است که برای سهولت کار میتوانید از آن استفاده کنید:
در لیست فوق اگر Verbose را انتخاب کنید کل انواع خطاها نمایش داده میشوند. اگر Debug را انتخاب کنیم پیامهای مربوط به Debug و تمام سطح زیر که عبارتند از info تا Assert نمایش داده میشوند، همینطور برای info که نتایج مربوط به info تا Assert را به شما نشان میدهد.
نکته: گفتیم که ورودیهای متد Log دو رشته هستند که با ویرگول جدا میشوند. اگر بخواهیم یک متغیر عددی در Log نمایش دهیم باید قبل از آن از "" +
استفاده کنیم. مانند:
int number= 5;
Log.i("Number of Items: ", "" + number);
در ادامه با ما همراه باشید.