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

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

دیگر برنامه اندروید برای موبایلتان را خودتان بنویسید.
زبان اندروید
قسمت سوم:
بعد از تمام مراحل اولیه ای که انجام دادید، وقت آن رسیده که یاد بگیرید چطور یک پروژه‌ی اندرویدی بسازید. برای این کار برنامه ایکلیپس را باز کنید.

۱.از منوی ایکلیپس File -> New -> Project.

بعد روی Android کلیک کنید تا زیرشاخه هاش باز بشه، بعد هم Android Application Project و Next.

خوب حالا باید مشخصات پروژه تون رو تعیین کنید.
اولین گزینه اسم برنامه است، (همون اسمی که تو play store خواهد بود و همین طور توی لیست برنامه ی گوشی)
فیلد بعدی اسم پروژه‌ایه که می‌خواید بسازید و فقط تو محیط ایکلیپس ازش استفاده می‌شه و می‌تونه همون اسم واقعی برنامه‌تون باشه.
فیلد بعدی اسم پکیج یا بسته‌ی برنامه‌تونه و package name معمولا برعکس دومین سازنده‌ی برنامه است. باید حواستون باشه که این اسم خیلی مهمه چون وقتی می‌خواید برنامه‌‌تون رو به روز رسانی کنید تنها راهی که سیستم اندروید متوجه می‌شه این آپدیت مربوط به کدوم نرم‌افزاره از همین طریقه. و باید توی این دنیای برنامه‌ها هر برنامه‌ای package name مخصوص خودش رو داشته باشه.
در قسمت بعدی باید کمترین نسخه‌ی اندرویدی که برنامه‌تون پشتیبانی می‌کنه رو انتخاب کنید، مثلا اگه از هیچ ویژگی خاص جینجربرد استفاده نمی کنید، معقول تره که نسخه های پایین تری ازش رو انتخاب کنید تا کاربرانی که نسخه های پایین تری دارند هم بتونن از برنامتون استفاده کنن. خود گوگل هم پیشنهاد کرده API 8 رو انتخاب کنید تا تقریبا تمام گوشی‌های اندروید برنامه‌تون رو اجرا کنن.
در فیلد بعدی باید بالاترین نسخه‌ی اندروید که برنامتون می‌تونه روش کار کنه رو انتخاب کنید، مشخصه که هرچه سطحش رو بالاتر بگیرید گوشی‌های جدید هم می‌تونن از برنامه‌تون استفاده کنن، ولی باید حواستون باشه که حتما برنامه رو تو نسخه‌های دیگه هم تست کنید تا مشکلی برای کاربرها پیش نیاد.
Next رو بزنید.

گزینه ی ceate custom launcher icon اگه تیک خورده باشه یعنی اینکه همین الان که می‌خواهید پروژه‌ی برنامه‌تون رو بسازید، بیاید آیکون برنامه‌تون رو هم طراحی کنید و بذارید تو برنامه.
گزینه‌ی بعدی یه فعالیت (activity) میسازه. و مشخصه که هر برنامه ای حداقل باید یه صفحه داشته باشه که همون فعالیته. پس بذارید گزینه‌ی Create Activity فعال بمونه.
گزینه‌ی بعدی برای اینه که بخواید کتابخانه‌ی اندروید بسازید.
گزینه‌ی بعدی هم اگه تیکش رو بردارید می‌تونید محل ذخیره شدن پروژه رو تغییر بدید.حالا که همه چیز رو مشخص کردید next رو بزنید.

۲. اگر تو مرحله‌ی قبل گزینه‌ی ساختن آیکون رو تیک زده باشید حالا ازتون می خواد که آیکون برنامه‌تون رو درست کنید، می‌تونید یه نوشته رو انتخاب کنید و تزئینش کنید (Text) یا از طرح‌های گرافیکی خود اندروید استفاده کنید (Clipart) یا اینکه یه عکسی رو از توی کامپیوترتون انتخاب کنید و به عنوان آیکون برنامه ازش استفاده کنید.
بعد با گزینه هایی که داره محل قرار گرفتن عکس رو تنظیم کنید. گزینه‌ی Trim Surrounding Blank Space فضای خالی اطراف عکس رو می‌بره. اگه تیکش رو بردارید، می تونید خودتون انتخاب کنید چقدر از فضای اضافه‌ی دور عکس بمونه.
Shape سه تا حالت داره یا هیچی (None) یا مربعی (Square) یا دایره‌ای (Circle). و می‌تونید رنگ پس زمینه رو هم انتخاب کنید.
بعد از طراحی آیکون برنامه‌تون next رو بزنید.

۳. حالا باید انتخاب کنید که یه فعالیت معمولی می‌خواید یا یه فعالیت با جزئیات جامع (MasterDetailed). اگر فعالیت با جزئیات کامل رو انتخاب کنید بهتون این امکان رو می‌ده که روی تبلت‌ها دو تا ستون داشته باشید و روی صفحات کوچکتر یه ستون و دوتا فعالیت براتون می‌سازه و غیره و ازتون می‌خواد که سطح API برنامه‌تون رو بالاتر از API 11 انتخاب کنید تا این ویژگی فعال شه. اگر هم یه فعالیت معمولی می‌خواید که می‌تونید next رو بزنید.

۴.اگر در قسمت قبل انتخاب کرده باشید که یه فعالیت (activity) بسازید، الان ازتون می‌خواد که اول اسم فعالیت رو انتخاب کنید بعد اسم صفحه بندی‌اش رو انتخاب کنید. بعد ازتون می‌خواد ماهیت فعالیتتون رو انتخاب کنید اگر None رو انتخاب کنید مشکلی نیست ولی اگه هر کدوم از گزینه‌های دیگه رو انتخاب کنید ازتون می‌خواد که کمترین سطح API تون رو ۱۴ بذارید (و طبعا باید API 14 رو هم دانلود و نصب کرده باشید)
Finish رو بزنید تا پروژه ساخته بشه.

ممکنه ازتون بخواد که کتابخانه‌ی اندروید رو نصب کنید
به مسیری که sdk تون ذخیره شده برید، جایی که فولدرهای tools, platform-tools, platforms و…. قرار داره، یه فولدر با اسم extras بسازید، بعد توش یه فولدر دیگه به اسم android بسازید، بعد این فایل رو دانلود کنید و از حالت فشرده خارج کنید و داخل فولدری که همین الان ساختید قرار بدید، ایکلیپس رو اگه باز هست ببندید و دوباره اجراش کنید، حالا شروع به ساختن پروژه‌ی جدید کنید.

۵.خوب بعد از اینکه پروژه ساخته شد. قسمت سمت چپ ایکلیپس توی ستون Package Explorer باید اسم پروژتون رو ببنید. روی دکمه‌ی مثلثی بغلش کلیک کنید تا زیرشاخه هاش رو نشون بده، بعد src رو انتخاب کنید و بعد هم اسم package تون رو. می بینید که یه فایل جاوا ساخته شده که مربوط به همون activity هست که تو مرحله قبل دستور داده بودید بسازه.
ما تو این فایل جاوا می تونیم توابع مختلفی رو override (دوباره نویسی تابعی که از والد -در اینجا کلاس Activity- ارث بری شده) کنیم تا activity کامل تری داشته باشیم. نویسنده فرزین نجفی پور. به طور پیش فرض خودش onCrete رو override کرده. همون طور که قبلا اشاره شد، می تونیم توابعی مثه onPause , onStart و… رو override کنیم.
۶.override کردن تابع onCreate ضروریه و می بینید که اول دستور super.onCreate رو فراخوانی می کنه بعد هم با دستور setContentView محتواش رو روی صفحه بندی (layout) این activity تنظیم می کنه. (با ارجاع به فایل xml ای که در شماره بعد توضیح داده شده) تا وقتی که ContentView تنظیم یا ست نشده باشه ما در خروجی چیزی نمی بینیم.
۷.اون R.layout.main به فایل xml ای ارجاع داده میشه به نام main. این فایل xml در زیرشاخه res و بعد هم layout قرار داره. (بقیه زیر شاخه ها رو بعدا آموزش خواهم داد) که اگه روش کلیک کنید براتون یه صفحه ای رو میاره که توش واسط کاربری (UI) برنامه تون رو میتونید درست کنید.
۸.اگه از قسمت پایینی همین صفحه activity_main.xml رو انتخاب کنید، کد xml نوشته شده برای نمایش این فعالیت (activity) رو بهتون نشون میده. همون طور که می بینید این فعالیت (activity) روی یک Relativelayout سوار شده (خط ۱ کد) و یک TextView هم که به صورت پیش فرض روی صفحه بود اینجا ساخته و مقدار دهی شده. (خط ۱۱ کد). در پست های بعدی این قسمت بیشتر توضیح داده خواهد شد.
۹. خوب حالا برای اجرای نرم افزار روی دکمه‌ی Run بالای صفحه کلیک کنید (توی تصویر مشخصه). و چون اولین باره که می خواید پروژه های اندرویدی رو اجرا کنید ازتون می پرسه چه مدلی قصد دارید اجراش کنید، همون اولین گزینه یعنی Android Application رو انتخاب کنید و OK رو بزنید.
۱۰.حالا شبیه ساز (emulator) شروع به شبیه سازی این برنامه می کنه یعنی اول برنامه رو روی دستگاه مجازی نصب می کنه و بعد هم اون رو اجرا می کنه.
و اگه تو دستگاه مجازی به قسمتی برید که همه برنامه ها رو نشون میده می‌بینید که این برنامه هم نصب شده و با باز و بسته کردن شبیه ساز از بین نمی ره و تنها در صورتی از بین می ره که خودتون wipe user data رو که قبلا توضیح دادم رو انتخاب کرده باشید یا به صورت دستی پاکش کنید (uninstall).

۱۱.خوب تا اینجا فهمیدیم که یه پروژه به صورت پیش فرض یه فایل جاوا داره که کلاس Activity رو ارث بری (extends) می کنه و توش به یه فایل xml اشاره می کنه که همون UI یا واسط کاربریه.
حالا بیاید با فولدرهای دیگه‌ی پروژه آشنا بشیم. در ستون سمت چپ یه فولدری هست به نام gen که توصیه‌ی اکید میشه اصلا دستکاریش نکنید. چون شامل فایل هایی هست که به صورت خودکار generated میشه. ولی حالا یه کم درباره اش توضیح می دیم. روی فایل R.java کلیک کنید تا بازش کنه.

همین طور که در طول برنامه ما منابعی (resources) رو به برنامه اضافه می کنیم (که در فولدر res ذخیره می‌شن) اندروید به صورت خودکار ورودی هایی رو براشون در این فایل R.java تعبیه می کنه. مثلا برای آیکن برنامه یه ورودی ic_launcher ساخته و بهش یه عدد خاصی رو نسبت داده.
خوب حالا لازم نیست نگران این قسمت باشید فقط می خواستم بدونید هم چین فایلی وجود داره.

۱۲.فولدر بعدی که می خوایم بررسی کنیم android 2.1 هست، این فولدر در واقع همون SDK هست که شامل تمام توابع و ساختار هاییه که به صورت پیش فرض تعریف شده و همشون در یک کتابخانه‌ به نام android.jar گردآوری شده. شاید در طول انجام پروژه اصلا نیازی پیدا نکنید که بهش مراجعه کنید ولی خوب اگه از توابع و اینا خواستید مطلع بشید می تونید یه نگاهی بهش بندازید.
۱۳. بعدش فولدر assets هست (که بعدا بهش می پردازیم) و بعد هم فولدر res که مخفف resources به معنی منابع هست و تمام عکس ها و فایل هایی که می خواید تو برنامه تون ازش استفاده کنید رو باید اینجا نگه داری کنید. مثلا الان آیکن برنامه به صورت پیش فرض توی فولدرهای drawable وجود داره. تمام فایل های xml مربوط به layout ها (صفحه بندی ها) دراینجا نگه داری می شه.
۱۴. فایل بعدی AndroidManifest.xml هست که توی پست بعدی مفصل دربارش توضیح خواهیم داد. در واقع این فایل یک ویرایشگر بصریه (Visual Editor) که قسمت های مختلف نرم افزار رو می تونیم توش تغییر بدیم. در واقع این فایل برنامه شما رو برای سیستم اندروید تعریف و تشریح می کنه.

دو تا فایل بعدی یعنی progaurd.cfg و project.properties هم مهم نیستن.

خوب این یه شناخت پایه ای بود بر پروژه های اندرویدی!

منبع:http://hhy.ir/index.php?pid=2&op=2&id=1849

کار کردن با AndroidManifest.xml

۱.حالا یک نگاه دقیق تری روی AndroidManifest.xml داشته باشیم به خاطر اینکه فایل مهمیه و برنامه شما رو برای سیستم اندروید تشریح می کنه، پس مهمه که همه چیز رو در این فایل درست وضع کرده باشید. خوب یه پروژه اندروید بسازید (نحوه انجام این کار) و روی AndroidManifest.xml کلیک کنید تا باز بشه. خوبیه ایکلیپس اینه که به شما اجازه می ده این فایل رو در حالتهای مختلفی ویرایش کنید،

۲.وقتی به حالت ویرایش xml نگاه می کنید میبینید که خیلی ساده تر از حالت ویرایش بصریه و بیشتر توسعه دهنده ها معمولا حالت ویرایش xml رو بیشتر می‌پسندن، ولی خوب این حالت یه نقطه ضعف هایی هم داره، مثلا ویژگی پیشنهاد کد (code hinting) نداره و برای صوفه جویی در وقت تو این جور مواقع بهتره از همون حالت ویرایش بصری کمک بگیریم.

۳.خوب حالا بیاید این حالت های ویرایش بصری رو یه نگاهی بندازیم و بررسی کنیم. در قسمت Manifest ما بسته (package) برنامه رو تعریف می کنیم (که قبلا انجام دادیم). و می تونیم نسخه‌ی (version) درونی برنامه رو تعیین کنیم و یه رشته‌ی (string) شماره نسخه تعیین که کاربر می بینه. کاری که بعده ها قراره تو این صفحه انجام بدیم خروجی گرفتن از برنامه است (با کلیک روی Use the Export Wizard)

۴.در حالت ویرایش xml، تگ های manifest و application تغییراتی رو که در نوار Manifest و Application ایجاد می کنید منعکس می کنه.

۵. در نوار Application، موارد مختلفی رو می تونید تنظیم یا ویرایش کنید، مثلا Label همون اسم نرم افزارتونه که تو گوشی اجرا میشه، یا icon تصویریه که از برنامه شما تو گوشی دیده میشه، یا Theme که تو آموزش های آینده بیشتر توضیح داده خواهد شد. مثلا تو قسمت Permissions می تونید به کاربر قبل از نصب برنامتون هشدار بدید که از چه اطلاعاتیش استفاده می کنید.
تو اون قسمت پایینی به اسم Application Nodes، می تونید فعالیت های (Activities) برنامه رو تعریف کنید. (که فعلا تنها یه فعالیت main وجود داره.)

۶. در نوار Permissions می تونیم تمام در خواست هایی که از کاربر داریم (برای استفاده از اطلاعات داخل گوشیش) رو مطرح کنیم و از کاربر قبل از نصب برنامه اجازه استفاده از اون اطلاعات خاص رو بگیریم.

در مورد Instrumentation ، در این دوره به آن نمی پردازم.

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

۱.برای شروع اول یه پروژه اندروید تو ایکلیپس می‌سازیم. از منوی سمت چپ روی اسم پروژه کلیک می کنیم و از شاخه‌ی src به دومین زیر شاخه می‌ریم که یه فایل جاواست. این فایل کلاس فعالیت رو ارث‌بری می‌کنه و توسعه می‌ده. تو خط آخر این فایل جاوا می‌بینیم که محتوای بصری این فعالیت (ContentView)، رجوع داده شده به یه فایل به نام main که در فولدر layout در منابع (resource) هست.

۲.پس اگه بریم توی شاخه‌ی res و بعد layout و بعد main.xml این فعالیت رو می‌بینیم. که به طور پیش فرض یه متن Hello World در آن وجود داره. توصیه می‌کنم برای اینکه مطمئن بشید برنامه‌تون درست کار می کنه یه بار Run کنید.
۳.خوب حالا می‌خوام خیلی سریع چند تا نکته رو تو AndroidManifest.xml براتون توضیح بدم. در حالت ویرایش xml، می‌بینیم که درون تگ application، تگ activity وجود داره. یکی از چیزایی که اینجا می‌بینیم هست. (که با توضیحات مفصل تو یه پست دیگه بررسی خواهد شد) به طور ساده، این تگ به سیستم اندروید می‌گه که وقتی این برنامه شروع به کار می‌کنه، اولین فعالیتی که باید اجرا بشه، اون فعالیتیه که داخل تگ action قرار داره. و این طور معرفی شده :

۴.اگه بخوایم یه فعالیت دیگه هم به برناممون اضافه کنیم، احتیاج داریم که دو فایل Main.java و main.xml رو دوباره بسازیم. (البته اسم این دوفایل رو هرچیزی که دلتون بخواد می‌تونید بذارید و محدودیتی نداره ولی برای فراگیری راحتتر، سعی کردم که در همه پروژه‌ها اسم‌های یکسانی انتخاب کنم) یعنی باید اول یه فایل جاوا بسازیم که کلاس activity رو ارث‌بری کنه. برای این کار روی اسم package راست کلیک می‌کنیم، بعد New و بعد هم class.

۵.یه اسمی براش بذارید (جلوی فیلد Name) من اسمش رو می‌ذارم Dovomi و بعد رو Browse کلیک کنید. اینجا می‌خوایم کلاسی رو انتخاب کنیم که این فعالیت قراره ارث‌بری کنه. پس تو فیلد choose type بنویسید activity و کلاس Activity – android.app رو انتخاب کنید. روی ok کلیک کنید بعد هم Finish.

۶.حالا یه فایل جاوا درست شده به نام Dovomi که کلاس Activity رو ارث‌بری می‌کنه. این فعالیت باید تابع (متد)‌ onCreate رو دوباره نویسی (override) کنه. توی کلاس بنویسید oncre و با زدن ctrl + space اسم توابعی (متدهایی) که با این حروف آغاز می‌شه رو میاره، تابع onCreate رو انتخاب کنید.

۷.قدم بعدی، اینه که یه فایل xml بسازیم که شبیه main.xml باشه ولی واسط کاربری فعالیت Dovomi رو نگه داره. وقتشه که از سومین دکمه‌ی مخصوص اندروید که در toolbar ایکلیپس وجود داره استفاده کنیم (این دکمه به ما کمک می‌کنه که یه فایل xml اندرویدی بسازیم ) روش کلیک کنید، صفحه‌ای باز می‌شه، برای این فایل یه اسم بذارید (جلوی فیلد File) البته این نام گذاری خیلی سخت و محکمه – تنها از حروف کوچک و اعداد و خط زیر _ می تونید استفاده کنید و اول اسم هم باید با حروف شروع بشه – خوب Resourse Type که Layout باشه. Root Element به معنای المان ریشه رو هم باید انتخاب کنیم. فعلا همون LinearLayout باشه تا بعدا مفصل بقیه رو توضیح بدم. نویسنده فرزین نجفی پور. LinearLayout ساده‌ترین طرح‌بندی صفحه است که وقتی چیزهایی رو به صفحه اضافه می‌کنیم به روش طولی (Linear) طرح‌بندی(Layout) می‌کنه. وقتی Finish رو بزنید یه فایل xml می‌سازه.

۸.وقتی فایل xml ساخته شد برای شما در حالت طرح‌بندی گرافیکی (Grafical Layout) میاره. که از اینجا می‌تونید هر عنصری که بخواید رو توی صفحه‌بندی تون انتخاب کنید. می‌تونید برای شروع یه متن از ستون سمت چپ بکشید و توی صفحه‌ی مشکی رها کنید، برای تغییر متن، روش یه بار کلیک کنید و از properties (که قبلا آورده بودیمش سمت راست محیط کارمون)، فیلد Text رو پیدا کنید و متنش رو تغییر بدید. از بخش properties خیلی از ویژگی‌های عناصر رو می‌شه تعیین کرد.

۹. حالا که فعالیت دوم رو ساختیم، نیاز داریم که یه جوری تو برناممون اجراش کنیم، چون وقتی برنامه باز می‌شه همون فعالیت اصلی اجرا می‌شه. برای این منظور، به فعالیت اصلی‌مون می‌ریم (main.xml) و یه دکمه می‌ذاریم. در قسمت properties، خود ایکلیپس به طور پیش فرض، یه id برای دکمه می‌ذاره (اینجا button1)، که برای ارجاع هرچیزی به این دکمه، به id (شناسه) اش احتیاج داریم. شما می‌تونید این شناسه رو از همین‌جا تغییر بدید.

۱۰.الان می‌خوایم یه کدی بنویسیم که وقتی کاربر روی این دکمه کلیک کنه، فعالیت Dovomi اجرا بشه. برای این‌کار می‌ریم به فایل main.java. زیر آخرین خط نوشته شده در تابع (متد) onCreate، چند خط اضافه می‌کنیم تا به اون دکمه‌ای که ساختیم بتونیم رجوع بدیم. برای این منظور، یه کنترل Button می‌سازم به اسم b. برای ارجاع از دکمه‌ای که تو واسط کاربری ساختیم به این کنترل، باید از تابع findViewbyId استفاده کنیم. در واقع این تابع آدرس اون دکمه رو از واسط کاربری می‌گیره و به کنترلی (b) که تو فایل xml ساختیم ارجاع می‌ده. توی پرانتزهای این تابع بنویسید R.id وقتی یک نقطه بعد از این بگذارید، تمام اشیائی که می‌تونید بهشون رجوع بدید رو نشون می‌ده، button1 رو انتخاب کنید. (الان کنترل b، ارجاع داده شد به اون دکمه‌ای که در شماره قبل ساختیم)

۱۱.با زدن کلیدهای ctrl +1 در ویندوز و cmd + 1 در مک، می‌بینیم که از برنامه خطا می‌گیره و برای رفع مشکل پیشنهادهایی رو می‌ده، اینجا بهتره با انتخاب گزینه ‘import ‘Button کلاس دکمه رو وارد(import) می‌کنیم.

۱۲.بعد از این کار، دوباره از برنامه خطا می گیره چون نوع داده‌ای که به عنوان خروجی متد (تابع) findViewById هست (یعنی نوع داده‌ای view) با نوع داده‌ای دکمه فرق می‌کنه به همین خاطر باید cast [به معنی در قالب قرار دادن، به شکل درآوردن] بشه، با زدن ctr+1، بهمون پیشنهاد می‌ده که این کارو انجام بدیم.
۱۳.قدم بعدی اینه که متد setOnClickListener (به معنای گوش بزنگ کلیک) رو به کار ببریم تا هروقت کاربر روی دکمه کلیک کرد، بتونیم بهش پاسخ بدیم و باعث اجرای چیزی بشیم. برای این کار، باید این کد رو اضافه کنیم. () b.setOnCLickListener درون پرانتزها باید یه شی جدید از نوع onClickListener بسازیم. (یادتون باشه که می‌تونید برای راحتی کار و سرعت بیشتر چندتا حرف اول کلمات رو بنویسید و با زدن ctrl+space برنامه بقیه اش رو بهتون پیشنهاد می‌ده). این شی درواقع یه کنترل کننده‌ی وقایع (event handler) ناشناس هست.
خوب بازهم خطا گرفته، ctrl+1 می‌زنیم ببنیم چه پیشنهادی می‌ده، همون اولی یعنی وارد کردن کلاس onClickListener هست رو انتخاب می‌کنیم. در آخرین خط (بعد از بسته شدن پرانتز این دستور یک ; بگذارید)

۱۴.اونحایی که نوشته TODO // دستوراتی رو می نویسیم که می‌خوایم با فشردن دکمه اجرا بشن. خوب ما در اینجا می‌خوایم وقتی کاربر دکمه رو فشار داد، فعالیت Dovomi اجرا بشه. برای شروع کار یه فعالیت، از متد startActivity استفاده می‌کنیم. در داخل پرانتزهای این متد(تابع)، باید نمونه‌ای از کلاس intent رو انتقال بدیم (پاس کنیم). -بعدا مفصل به کلاس intent می‌پردازیم- ولی تا همین حد بدونید که کار این کلاس اینه که اعلام کنه، این مولفه رو می خوام فعال کنم. برای این کار باید یه شی جدید از نوع intent بسازیم (new intent) برای ساختن این شی چندین راه مختلف وجود داره، و چون ما می‌خوایم برای یه فعالیت ازش استفاده کنیم ازاین نوعش استفاده می‌کنیم (تو تصویر مشخصه) که یه contexView می‌گیره و یه کلاسی که مال فعالیت مورد نظرمون هست.

۱۵.درباره context باید بگم که از این به بعد نسبتا زیاد ازش استفاده می‌کنیم، به خاطر این که هر دفعه‌ای که از سیستم می‌خوایم تا چیزی رو اجرا کنه، یه context می‌فرستیم که مشخص می‌کنه چه مولفه‌ای این تقاضا رو داده. چند راه برای گرفتن context وجود داره، ولی چون ما در یه تابع داخلی ناشناس (anonymous inner method) هستیم، راحتترین روش برای این کار اینه که بگیم main.this که رجوع می‌ده به فایل main که اینجا داریم، به طور کلی این کار به این معنیه که سیستم متوجه بشه این درخواست از طرف main بوده.
دومین ورودی این تابع باید یه کلاسی باشی از اون فعالیتی که می‌خوایم اجرا کنیم، که Dovomi باشه. و می‌نویسیم Dovomi.class و آخر این خط یه ; می‌ذاریم.
۱۶.خیلی سریع کارایی که کردیم رو دوره می‌کنم، اول یه ارجاع گرفتیم از دکمه‌ای که تو فایل main.xml ساختیم، تابع onClickListener رو از نوع داخلی ناشناس نوشتیم که وقتی کاربر کلیک می‌کنه (درواقع توی گوشی که موس نیست کلیک کنه، منظورش همون فشاردادن با انگشته)، یه فعالیت جدید شروع بشه، که به عنوان ورودی یه intent بهش می‌دیم که مشخص کنه چه کسی این درخواست رو کرده (main)، و کدوم فعالیت قراره اجرا بشه(Dovomi).
خوب حالا بیاید این برنامه رو اجرا کنیم. وقتی رو دکمه کلیک می‌کنیم این پیغام خطا ظاهر می‌شه که The Application Activities has stopped unexpectedly یعنی فعالیت برنامه به صورت غیر منتظره‌ای قطع شده.

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

۱۷.دوباره به ایکلیپس برگردید، تا الان تو منظر جاوا داشتیم کار می‌کردیم، حالا می‌ریم سراغ منظر اندرویدی، اگه در قسمت بالا سمت راست صفحه‌ی ایکلیپس نگاه کنید، این دکمه رو می‌بینید روش کلیک کنید، other رو انتخاب کنید، یک منظر مختص اندروید وجود داره به نام DDMS اون رو انتخاب کنید. این منظر حاوی یه سری ابزار مختلف برای نظارت بر روی اینکه چطور برنامتون روی شبیه ساز یا گوشی کار می‌کنه، هست.

۱۸.یکی از فضاهای مفید LogCat هست، وقتی برنامتون روی شبیه‌ساز یا گوشی اجرا می‌شه، به طور مداوم پیغام‌هایی رو درباره‌ی چیزها می‌فرسته، همونطور که مشاهده می‌کنید یه سری پیغام قرمز رنگ هم داریم که به طور کلی چیز خوبی نیست.
دومین خط قرمز نوشته ActivityNotFoundException یعنی فعالیت مورد نظر رو پیدا نکرده، اما چرا؟ به خاطره اینه که هنوز این فعالیت رو به فایل manifest اضافه نکردیم. پس می‌ریم سراغ manifest تا تنظیمات لازم رو انجام بدیم.

۱۹.هر فعالیتی که در برنامه شما وجود داره، باید تو فایل manifest تعریف شده باشه، خوب پس الان باید تو فایل manifest یه فعالیت جدید درست کنیم، با نوشتن این کد

ساختن یه فعالیت جدید رو شروع می‌کنیم، در قسمت اسم باید به اسم فعالیتیمون ارجاع بدیم، یه نقطه (.) می‌گذاریم تا به بسته‌ی پیش فرض (ir.AndroidCode.ir) اشاره کنه و بعد می‌نویسیم Dovomi. چون نمی‌خواهیم intents تعریف کنیم، فقط کافیه همین کد رو بنویسم.

حالا دوباره پروژه رو اجرا کنید.

۲۰.وقتی برنامه تو شبیه ساز اجرا شد، روی دکمه کلیک کنید، می‌بینید که با این کار برنامه به فعالیت Dovomi رفته ولی هیچی نشون نمی‌ده و خبری از اون متنی که نوشته بودیم نیست، خوب اگه به فایل جاوامون برگردیم، تفاوت فایل جاوای dovomi و main در اینه که ما هنوز محتوای بصری رو به فایل جاوا ضمیمه نکردیم، (یعنی تابع setContentView رو استفاده نکردیم، چون این تابع به سیستم اندروید می‌گه که برای این فعالیت از کدوم محتوای بصری -فایل xml- استفاده بکنه)
پس این کد رو اضافه می‌کنیم. (ورودی تابع : به قسمت منابع یا resource بروید از پوشه ی layout فایل dovomi.xml رو بردارید)
setContentView(R.layout.dovomi);

حالا پروژه رو دوباره اجرا کنید.

۲۱.خوب دیگه این دفعه، وقتی رو دکمه کلیک می‌کنید به فعالیت دوم می ره و متنی که نوشتیم رو نشون می‌ده

ه طور خلاصه : باید اول یه فایل جاوا بسازید، اگه می‌خواید محتوای بصری جدیدی درست کنید یه فایل xml هم برای اون درست می‌کنیم و به فایل جاوا پیوست می‌کنیم (شماره ۲۰) ، یه بخش مهم اینه که این فایل xml رو تو manifest تعریف کنید (شماره ۱۹)

دریافت source code این برنامه موجود است و متقاضیان می توانند  آن را درخواست نمایند.

تا اینجا یاد گرفتیم که چطور با فعالیت ها (activities) کار کنیم، اگه یادتون باشه برای شروع فعالیت Dovomi از intent استفاده کردیم، کار مفهوم (intent) اینه که یه عنصری از برنامه تون رو فعال کنه.
دو نوع مفهوم (intent) وجود داره، مفاهیم آشکار و مفاهیم ضمنی یا مجازی.
با مفاهیم آشکار، یک عنصر مشخصی از برنامه رو برای فعال شدن تعیین می‌کنیم. مثلا می‌خوایم یه فعالیت(activity) دیگه رو تو برناممون اجرا کنیم، از یه مفهوم آشکار استفاده می‌کنیم که آشکارا به سیستم بگه می‌خوام اون فعالیت رو فعال(اجرا) کنم.
مفاهیم ضمنی (که تو پست بعدی بهش می‌پردازیم) در واقع یک پیام کلی برای سیستم می‌فرستن : که آیا برنامه‌ای در سیستم عامل این گوشی وجود داره که بتونه این مفهوم رو اجرا کنه؟ اگه وجود داشته باشه لیست این برنامه‌ها به کاربر پیشنهاد می‌شه و کاربر یکی رو انتخاب می‌کنه و از این طریق اون چیزی که با مفهوم فرستاده شده (ورودی‌های intent) اجرا می‌شه.

خوب الان می‌خوایم رو مفاهیم آشکار تمرکز کنیم. برای شروع یه پروژه بسازید با دوتا فعالیت (activitie) که تو فعالیت اصلی (main) یه متنی که قابل نوشتن باشه یعنی کاربر می‌تونیه توش متن وارد کنه (از توی Text Fields اولی رو انتخاب کنید) و یه دکمه (برای اینکه به فعالیت دوم بره)، فعالیت دوم هم یه فیلد متنی ساده داشته باشه.(حواستون باشه که فعالیت دوم رو هم تو فایل manifest تعریف کنید).

۲.کاری که با این برنامه می‌خوایم بکنیم اینه که : کاربر یه متنی رو تو فیلد متنی قابل نوشتن می‌نویسه و دکمه رو می‌زنه، فعالیت دوم باز می‌شه و متنی که نوشته بوده رو نشون می‌ده. یعنی می‌خوایم یاد بگیریم اطلاعاتی رو از یه فعالیت به فعالیت دیگه منتقل کنیم.
اول به فایل main.java می ریم و یه مرجع(اشاره‌گر) از دکمه و فیلد متنی می‌گیریم. با نوشتن این کد

EditText matn = findViewById(R.id.editText1);

یه مرجع از فیلد متنی قابل نوشتن‌مون می‌گیریم. خوب بازهم با ctrl+1 خطاهای برنامه رو درست می‌کنیم. (اینجا کافیه فقط cast انجام بدید.) همین کارو برای دکمه انجام می‌دیم.

Button d = findViewById(R.id.button1);

و برای دکمه تابع setOnclickListener رو صدا می‌زنیم تا کارایی که قراره با فشردن دکمه انجام بشه رو تعیین کنیم. با نوشتن این کد :

d.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

}
});

همون طور که قبلا گفته شد بعد از نوشتن new (خط اول) اگه بنویسید onclick و بعد ctrl+space رو بزنید خودش بهتون ادامه‌اش رو پیشنهاد می‌ده و روی OnClickListener که کلیک کنید، بقیه‌اش رو خودش می‌نویسه.

۳.الان قصد داریم که یه intent بسازیم، همون طور که قبلا اشاره شد intent یک راه برای فعال کردن جزئی از برنامه است. پس برای اینکه یه نمونه از کلاس Intent بسازیم، می‌نویسیم Intent و یه اسم براش می‌ذاریم و newاش می‌کنیم. (با ctrl+space، اون گزینه رو انتخاب می‌کنیم که مناسبه پاس کردن یه فعالیته -)

برای ورودی‌های سازنده‌ی intent، اول باید مولفه‌ای که این درخواست رو کرده بنویسیم یعنی Main.this (که یه مرجع به این فعالیت اصلی هست). برای ورودی دوم، باید کلاس فعالیتی رو بدیم که می‌خوایم اجرا بشه یعنی Dovomi.class. پس کدمون اینجوری می‌شه :

Intent mafhoom = new Intent(Main.this, Dovomi.class);

در واقع ما می‌تونستیم همین قسمت (new Intent(Main.this, Dovomi.class رو به عنوان ورودی startActvity به کار ببریم (مثل آموزش قبلی) ولی این دفعه می‌خوایم یه چیزایی رو ضمیمه‌ی mafhoom کنیم. چیزی که می‌خوایم اضافه کنیم همون متنیه که کاربر تو matn وارد می‌کنه. برای این کار از تابع putExtra از شی mafhoom استفاده می‌کنیم.

۴.ورودی اول این تابع یه رشته (String) است که به عنوان اسم اون کلیدی که می‌خوایم اضافه کنیم به کار برده می‌شه و ورودی دوم از هر نوعی می‌تونه باشه و ما چون اون متن رو می‌خوایم بفرستیم، برای ورودی دوم هم نوع رشته (String) رو انتخاب می‌کنیم. اسم کلید رو می‌ذارم “matneVaredShode” و برای بازیابی اطلاعاتی که داخل matn (متنی که قراره کاربر وارد کنه) وجود داره، باید از تابع getText استفاده کنیم و اگه دقت کنید می‌بینید که خروجی این تابع از نوع Editable هست نه از نوع رشته‌ی خام پس با اضافه کردن ()toString. اونو به رشته‌ی خام تبدیل می‌کنیم.
mafhoom.putExtra(“matneVaredShode”, matn.getText().toString());

از matn ایراد می‌گیره و با زدن ctrl+1 بهمون پیشنهاد می‌کنه که اونو به final تغییر بدیم (چون قراره ازش تو یه کنترل کننده وقایع ناشناس استفاده کنیم).

ما اون اطلاعاتی که می‌خواستیم به فعالیت Dovomi بفرستیم رو به mafhoom اضافه کردیم، حالا وقتی می‌خوایم فعالیت جدید رو شروع کنیم، این اطلاعات براش فرستاده می‌شه. تابع startActivity رو استفاده می‌کنیم و mafhoom رو به عنوان ورودی براش می‌فرستیم.
startActivity(mafhoom);

۵.خوب تا اینحا دیگه کار ما با Main.java تموم می‌شه، حالا باید به Dovomi.java بریم و اطلاعاتی که همراه mafhoom فرستاده شده بازیابی کنیم و تو textView نشون بدیم. برای شروع اول یه مرجع از فیلد متنی می‌گیریم با این کد :

TextView matni = (TextView) findViewById(R.id.textView1);
برای اینکه این فیلد متنی، متن دلخواه ما رو نشون بده باید از تابع setText استفاده کنیم(هرچی به عنوان ورودی بفرستیم رو نشون می‌ده)، برای گرفتن همون متنی رو که توسط mafhoom فرستاده شده، اول باید با getIntent مفهومی که این فعالیت رو اجرا کرده رو به دست بیاریم، و بعد از تابع getExtra برای گرفتن اطلاعات داخل intent استفاده می‌کنیم، که در واقع تمام اطلاعاتی که بهش داده بودیم رو برمیگردونه. اما ما فقط اون قسمتی از اطلاعاتش رو می‌خوایم که با کلید “matneVaredShode” مشخص شده (اگرچه در این تمرین قفط همین یدونه رو همراه mafhoom فرستادیم). و چون اون اطلاعاتی که می‌خوایم از نوع رشته است، از تابع getString استفاده می‌کنیم و کلید رو بهش می‌دیم.

matni.setText(getIntent().getExtras().getString(“matneVaredShode”));

۶.حالا برنامه رو اجرا می‌کنیم و می‌بینیم همون متنی که تو فعالیت اصلی وارد کردیم تو فعالیت دوم نشون داده می‌شه

حالا که خوب مفاهیم آشکار رو متوجه شدیم، وقتشه که به مفاهیم ضمنی بپردازیم، برای درک بهتر از یه مثال شروع می‌کنیم.
۱.شبیه ساز رو اجرا می کنم و برنامه‌ی Gallery رو از تو منوی برنامه‌ها اجرا می‌کنم و یه عکس از توش انتخاب می‌کنم، می‌بینید که بالای عکس یه دکمه share (به‌اشتراک‌گذاری) وجود داره. این دکمه بهتون اجازه می‌ده که این عکس رو برای یکی دیگه بفرستید، اما ممکنه یه عالمه برنامه تو گوشیتون داشته باشید که قادر به انجام این کار باشن. مثل ایمیل یا بلوتوث و … شما می‌تونید برنامه‌ی خودتون رو به این لیست برنامه‌ها که می‌تونن عکس رو به اشتراک بذارن اضافه کنید و این دقیقا کاریه که یه مفهوم ضمنی (implicit intent) انجام می‌ده.

تو برنامه‌ی Gallery، وقتی دکمه‌ی share رو فشار می‌دیم، این برنامه توسط یه مفهوم ضمنی به سیستم اندروید می‌گه :‌ آیا تو سیستم این گوشی برنامه‌ای وجود داره که بتونه اطلاعات رو بفرسته؟ من یه عکس دارم که می‌خوام بفرستم!
بعد سیستم به کاربر یه لیستی از برنامه‌هایی که قادر به انجام این کار هستن نشون می‌ده. توی شبیه ساز وقتی دکمه share رو می‌زنم، عکس رو تبدیل به MMS می‌کنه بدون اینکه از من سوال کنه چه برنامه‌ای رو می‌خوام، چون تنها برنامه‌ای که تو شبیه‌ساز قادر به مدیریت این کار هست، همین برنامه است.
قبل از اینکه به ادامه آموزش بپردازیم، ممکنه براتون سوال شده باشه که این تصویر رو چطور وارد شبیه‌ساز کردم، خوب اگه بریم سراغ اکلیپس و به DDMS بریم، می‌بینید که یکی از ابزارهای تو نوار بالایی، File Explorer هست که به شما اجازه می‌ده فایل‌های داخل دستگاه رو ببینید، من به sdcard رفتم و عکس مورد نظرم رو گذاشتم، برای گذاشتن فایل باید از دکمه‌ای استفاده کنید که بالا سمت راسته و اگه روش نگه دارید می‌نویسه push a file onto the device. بعد از اینکه فایل رو تو دستگاه گذاشتید باید یه بار reset کنید.

خوب برگردیم به ادامه آموزش، گفتیم که برنامه‌ی Gallery با استفاده از یه مفهوم (intent) یه پیغام به سیستم می‌فرسته، حالا از کجا بفهمیم، این مفهوم چه پیغامی رو به فرستاده؟ برای اینکار دکمه‌ی share رو تو شبیه‌ساز می‌زنیم بعد به ایکلیپس می‌ریم و اگه تو LogCat نگاه کنیم، خط های آخرش نوشته :
Starting: Intent { act=android.intent.action.SEND type=image/jpeg … 
android.intent.action.SEND یه مفهوم ضمنیه، که همراه با خودش نوع داده‌ای تصویر از نوع jpeg رو داره.

۲.بیاید یه برنامه بسازیم که بتونه به پیغامی که دکمه‌ی share می‌ده، جواب بده. اول یه پروژه‌ی جدید می‌سازیم، بعد به AndroidManifest.xml می‌ریم، جایی که می‌تونیم یه مفهوم ضمنی بسازیم، توی پروژه یه فعالیت (activity) اصلی داریم که من اسمشو گذاشتم main. و مشاهده می‌کنید که برای این فعالیت یه intent-filter وجود داره که قبلا دریاره‌اش توضیح دادم. برای ساختن یه مفهوم دیگه، همون بلوک intent-filter رو کپی میکنیم، هر کدوم از این بلوک‌ها به سیستم می‌گه که این فعالیت قادر به مدیریت این مفاهیمه.
در قسمت action کد جدید به جای MAIN می نویسیم، SEND.
برای category هم مقدار DEFAULT رو به جای LAUNCHER مینویسیم. این category به سیستم می‌گه که این مفهوم ا چه نوعیه که معمولا همون مقدار پیش فرض رو می ذاریم و خلاص :دی

۳.مورد بعدی که باید اضافه کنیم، یه تگ data است که نوع داده‌ای که می‌تونیم با این مفهوم مدیریت کنیم رو به اندروید می‌گه. یکی از حصوصیاتش mimetype هست که مساوی */image می ذاریم به این معنی که هرنوع عکسی رو می تونه مدیریت کنه.

با اضافه کردن همین چند خط کد، برنامه مون این توانایی رو پیدا می‌کنه که اگه کسی خواست عکسی رو بفرسته و روی دکمه‌ی share کلیک کرد، ما هم می‌تونیم اون رو براش مدیریت کنیم.
۴.وقتی عکس از برنامه‌ی Gallery برامون فرستاده شد، بیاید یه راهی برای نمایش اون فراهم کنیم. به فایل main.xml داخل layout می‌ریم و اون فیلد متنی رو پاک می‌کنیم. و از ستون سمت چپ تو قسمت Images & Media یه کدوم از گزینه هایی که می تونه تصویر رو نشون بده رو انتخاب می‌کنیم، و یه عکس الکی می ذاریم روش.

بعد به فایل جاوای مربوط به این xml می‌ریم، که main.java هست. اول یه مرجع از اون imageView که تو فایل xml گذاشتیم می‌گیریم. با نوشتن این کد (قبلا مفصل توضیح داده شده):

ImageView image = (ImageView) findViewById(R.id.imageView1);
۵.حالا می‌خوایم اون عکسی که از Gallery برامون فرستاده می‌شه رو به عنوان محتویات این imageView قرار بدیم. با استفاده از تابع setImageURI از کلاس imageView. این تابع باید به جایی اشاره کنه که قراره از اونجا محتویات تصویر مشخص بشه. و ما می‌خوایم این محتویات رو از مفهوم ضمنی بگیریم، پس می‌نویسیم (در آموزش قبل نوشتم):
image.setImageURI(getIntent().getExtras().get(Intent.EXTRA_STREAM));

از setImageURI خطا می‌گیره، باید crtl+1 رو بزنید و اولین گزینه ی تصحیح اینه که cast کنید. پس اینجوری می شه:
image.setImageURI((Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM));
این Intent.EXTRA_STREAM تمام رشته ای که این مفهوم می‌فرسته رو می‌گیره که در واقع آدرس URI همون عکسه است.
۶.برنامه رو run کنید. وقتی بالا میاد یه خطا می‌گیره که انتظارش هم می‌رفت، چون وقتی همین جوری برنامه رو اجرا کنید آدرس هیچ عکسی فرستاده نشده و موقعی که دارید واقعا برنامه تولید می‌کنید باید به این خطاها فکر کنید و راه حلی براشون پیدا کنید.
۷.حالا به Gallery میریم و روی عکس دکمه‌ی share رو می‌زنیم، و می‌بینیم که برنامه‌ی ما هم به لیستی که می‌تونه این کارو انجام بده اضافه شده!

و با انتخاب برنامه‌ی خودمون می‌بینیم که عکس فرستاده شده نمایش داده می‌شه.

آموزش ها همچنان ادامه دارد
فرزین نجفی پور: مدیرعامل شرکت دانش پژوهان طلیعه ایرانیان

درباره ی فرزین نجفی پور

پژوهشگر برتر کشور در چند سال متوالی - مخترع برتر کشور - ثبت 61 اختراع کاربردی در زمینه های کشاورزی، آبیاری، الکترونیک، رباتیک و هوا فضا - دارای مدرک کارشناسی ارشد - ارایه بیش از 100 مقاله علمی - دریافت دهها تندیس ویژه علمی - دریافت بیش از 150 تقدیر نامه از وزارت خانه ها و مراکز علمی و پژوهشی - برپایی بیش از 150 نمایشگاه تخصصی اختراعات - پیشگام در دفاع سایبری عملی از حریم جمهوری اسلامی ایران

همچنین ببینید

چگونه پوست صورت خود را زیبا کنیم؟

اسیدهای میوه کارکردهای بسیاری برای پوست دارند. آنها می توانند همه کاربرای زیبایی پوست انجام دهند؛ ...