1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

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

شروع موضوع توسط minaaa ‏10/2/14 در انجمن اندرویید

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۱: چرا باید کار با اندروید استودیو را فرا گرفت ولی نباید با آن کار کرد[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. چرا بایستی توسعه اپلیکیشن با اندروید استودیو را یاد بگیریم.
    2. چرا نمی بایست در توسعه اندروید روی اندروید استودیو تمرکز کنیم.
    3. روشی به منظور ارتقاء سرعت اجرای اندروید استودیو

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

    ادامه مطلب را از دست ندهید.

    [h=3]چرا بایستی توسعه اپلیکیشن با اندروید استودیو را یاد بگیریم؟[/h] در این قسمت قصد داریم تا به مزایای محیط برنامه نویسی اندروید استودیو اشاره ای داشته باشیم. اندروید استودیو رایگان است و برای دانلود و شروع کار با آن هیچ هزینه ای نیاز نیست بپردازیم(اگر چه که در اینجا حتی فتوشاپ هم رایگان است اما اندروید استودیو واقعاً رایگان است). یکی از مزیت های اندروید استودیو بر محیط برنامه نویسی اکلیپس این است که نیازی نیست تا SDK و ADT را روی آن نصب کنیم بلکه از قبل این کار توسط گوگل روی آن صورت گرفته است(البته همانطور که در مقدمه این سری از آموزش ها بیان شد، محیط توسعه اندروید ADT Bundle نیز همین شرایط را دارا است).

    با فعال کردن Preview All Screen Sizes در اندروید استودیو این امکان برای ما فراهم خواهد شد تا بتوانیم به طور همزمان خروجی اپلیکیشن خود در سایزهای مختلف را مشاهده کنیم:

    [​IMG]
    تصویر فوق نمایی از Preview All Screen Sizes پروژه My First Android Project است که در قسمت ششم از این سری از آموزش ها ایجاد کردیم. در حقیقت این ویژگی اندروید استودیو امکانی را برای ما فراهم می آورد که بتوانیم UI اپلیکیشن خود را به صورت هم زمان روی دستگاه هایی با ابعدا مختلف مشاهده کنیم(البته کلیه مدل های استفاده شده مربوط به برند Nexus می باشند).

    از دیگر ویژگی های اندروید استودیو این است که اگر پروژه را در اکلیپس ساخته باشیم و بخواهیم کار توسعه اپلیکیشن خود را در محیط اندروید استودیو ادامه دهیم، به راحتی خواهیم توانست پروژه ایجاد شده در اکلیپس را به اندروید استودیو Import کنیم.

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

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

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

    [​IMG]
    [h=3]چرا نمی بایست در توسعه اندروید روی اندروید استودیو تمرکز کنیم![/h] اندروید استودیو در ابتدای راه تکامل خود است و چنانچه ما به عنوان یک برنامه نویس مبتدی قصد داشته باشیم در این راه تکامل همراه اندروید استودیو باشیم با احتمال قریب به یقین با چالش های فراوانی رو به رو خواهیم شد. به عبارت دیگر از زمان نصب اندروید استودیو گرفته که ممکن است در دانلود پکیج Gradle با مشکل رو به رو شویم تا اجرای پروژه خود در اندروید استودیو که زمان به مراتب بیشتری نسبت به اکلیپس از ما خواهد گرفت تا روی Emulator اجرا گردد به منزله دو چالش عمده ای است که در ابتدای راه با آنها مواجه خواهیم شد(لازم به ذکر است سرعت اجرای پروژه در اندروید استودیو آنقدر کم است که اگر خیلی خود انگیزه نباشیم به طور حتم توسعه اندروید را برای همیشه کنار خواهیم گذاشت).

    [h=3]روشی به منظور ارتقاء سرعت اجرای اندروید استودیو[/h] به عنوان راه کاری که از آن طریق می توان سرعت اندروید استودیو را تا حدودی ارتقاء بخشید می توان به غیر فعال کردن گزینه Real-time file system protection به معنی "محافظت از فایل های سیستم به صورت هم زمان" در نرم افزار آنتی ویروس نصب شده روی سیستم اشاره کرد. در حقیقت زمانیکه این گزینه فعال باشد، هر موقع که اقدام به اجرای پروژه خود در اندروید استودیو می کنیم، کلیه فایل های موجود در Output Directory یا "دایرکتوری خروجی برنامه" اسکن می شوند و همین مسئله موجب می گردد که سرعت توسعه اپلیکیشن به مراتب پایین تر آید. اعمال این تنظیمات بسته به نوع آنتی ویروسی که استفاده می کنیم می تواند متفاوت باشد اما برای مثال در آنتی ویروس ESET Smart Security 4 این تغییرات به صورت زیر صورت خواهد گرفت:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، وارد Setup آنتی ویروس شده و از بخش Real-time file system protection همانطور که در تصویر فوق با بیضی قرمز رنگ مشخص شده است روی گزینه Configure به معنی "تنظیم کردن" کلیک می کنیم و سپس پنجره ای به شکل زیر خواهیم دید:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، می بایست تیک دو گزینه ای که با بیضی های قرمز رنگ مشخص شده اند را برداشته سپس روی گزینه OK کلیک کنیم. در نهایت با اینکار احتمال می رود که سرعت اجرای اپلیکیشن ها در اندروید استودیو مقداری افزایش یابد.

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

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. مزیت اکلیپس بر اندروید استودیو چیست؟
    2. چرا سرعت اجرای اپلیکیشن در اندروید استودیو تا حدودی پایین است؟
    3. به چه شکل می توان این سرعت را تا حدودی ارتقاء بخشید؟
     
  2. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۲: نحوه ساخت ماشین مجازی در اندروید استودیو[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. نحوه ساخت ماشین مجازی در اندروید استودیو
    2. به کار گیری ماشین های مجازی از پیش تعریف شده

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

    [h=3]نحوه ساخت ماشین مجازی در اندروید استودیو[/h] برای ایجاد یک ابزار AVD در محیط توسعه اپلیکیشن اندروید استودیو می بایست همانطور که در تصویر زیر نشان داده شده است، از منوی اصلی نرم افزار وارد گزینه Tools به معنی "ابزارها" شده سپس وارد زیرشاخه Android و در نهایت روی گزینه AVD Manager کلیک نماییم:

    [​IMG]
    پس از کلیک کردن روی این گزینه، پنجره ای به شکل زیر مشاهده خواهد شد:

    [​IMG]
    اگر خاطرمان باشد این پنجره دقیقاً شبیه به پنجره ساخت Emulator در اکلیپس است. از سوی دیگر نکته جالب توجه اینجا است که ماشین مجازی ساخته شده در محیط برنامه نویسی اکلیپس در این پنجره نیز نشان داده می شود با این تفاوت که کنار اسم ماشین مجازی یک علامت ضربدر قرمز رنگ خورده است که این علامت نشانگر وجود مشکلی در این ماشین مجازی است. برای اینکه ببینیم مشکل در کجاست، روی نام این ماشین مجازی کلیک کرده سپس دکمه Edit را می زنیم و پنجره ای به شکل زیر مشاهده خواهیم کرد:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، کلیه تنظیمات دقیقاً همان تنظیماتی است که در حین ساخت ماشین مجازی در اکلیپس اعمال کرده بودیم با این تفاوت که در بخش Target هیچ نسخه ای از اندروید مشخص نشده است. نوشته داخل علامت بیضی قرمز رنگ حاکی از آن است که برای این ماشین مجازی هیچ نسخه سیستم عامل اندرویدی مشخص نشده است از این رو این ماشین مجازی به هیچ وجه کار نخواهد کرد. چنانچه روی کادر قرمز رنگ همانطور که در تصویر زیر نشان داده شده است کلیک کنیم خواهیم دید که تنها یک نسخه از سیستم عامل اندروید وجود دارد که می توانیم از آن برای ساخت ماشین مجازی استفاده کنیم و آن هم نسخه 4.2.2 است:

    [​IMG]
    با انتخاب این گزینه مشکل ماشین مجازی رفع خواهد شد و می توانیم از همین ماشین مجازی که در اکلیپس ساختیم در اندروید استودیو هم استفاده کنیم و همانطور که در تصویر زیر مشخص است یک تیک سبز کنار نام ماشین مجازی خواهد خورد به این معنی که این ماشین مجازی آماده اجرا است:

    [​IMG]
    اما این در حالی است که اگر این ماشین مجازی را در محیط اندروید استودیو ویرایش کنیم و آن را برای نسخه سیستم عامل اندروید 4.2.2 تنظیم کنیم، چنانچه بخواهیم این ماشین مجازی را در محیط اکلیپس اجرا کنیم باز هم با موقعیت زیر مواجه خواهیم شد:

    [​IMG]
    تصویر فوق مربوط به محیط اکلیپس است. در حقیقت از آنجا که در محیط اکلیپس نسخه سیستم عامل این ماشین مجازی را نسخه 2.1 قرار داده بودیم، اکلیپس متوجه می شود که این ماشین مجازی ویرایش شده و نسخه سیستم عامل اندروید 4.2.2 برای آن درنظر گرفته شده است و از آنجا که ما در محیط اکلیپس SDK مربوط به نسخه سیستم عامل اندروید 4.2.2 را نداریم از این رو اکلیپس این ماشین مجازی که خود ساخته بود را دیگر نخواهد شناخت. راه کار اول برای رفع این مشکل این است که همانطور که در تصویر زیر مشخص است مجدد در اکلیپس در پنجره فوق این ماشین مجازی را انتخاب کرده سپس روی دکمه Edit کلیک کنیم و از بخش Target نسخه سیستم عامل اندروید 2.1 را انتخاب نماییم:

    [​IMG]
    با اینکار مشکل رفع شده و می توانیم مجدد از همین ماشین مجازی در محیط اکلیپس استفاده کنیم اما این در حالی است که این ماشین مجازی مجدد در محیط اندروید استودیو از تنظیم خارج خواهد شد. به عبارت دیگر با این روش هر زمان که بخواهیم با هر یک از IDE ها کار کنیم می بایست این تنظیمات مربوط به ماشین مجازی را انجام دهیم و این در حالی است که اینکار تاحدودی غیر منطقی به نظر می رسد.

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

    [​IMG]
    همانطور که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است، Tab یی تحت عنوان Android Virtual Device به معنی "ماشین مجازی اندروید" دقیقاً شبیه به مراحل ساخت ماشین مجازی در اکلیپس است.

    [h=3]به کار گیری ماشین های مجازی از پیش تعریف شده[/h] ابتدا به تصویر زیر توجه کنید:

    [​IMG]
    در این تصویر در کنار Tab مربوط به Android Virtual Device یک Tab دیگری تحت عنوان Device Definitions به معنی "دستگاه های از پیش تعریف شده" وجود دارد که با یک بیضی قرمز رنگ مشخص شده است در این Tab دستگاه های مجازی از پیش تعریف شد ای وجود دارند که توسعه دهنده با استفاده از هر کدام از اینها دیگر نیازی ندارد تا کلیه تنظیمات را خود انجام دهد(اطلاعاتی همچون اندازه صفحه هر کدام و همچنین مقدار RAM اختصاص داده شده به هر دستگاه نشان داده شده است). به طور مثال در تصویر فوق گزینه اول انتخاب شده است که به رنگ آبی در آمده است که Nexus S نام دارد. حال با کلیک کردن روی گزینه Create AVD که در تصویر فوق با یک فلش قرمز رنگ مشخص شده است می توان به پنجره تنظیمات رفته و آن را طبق نیاز خود Customize کرد و کار ساخت یک ماشین مجازی را به پایان رساند. از جمله کارهایی در که در Customize کردن می توان انجام داد می شود به تغییر نام ماشین مجازی اشاره کرد.

    اما چنانچه بخواهیم یک ماشین مجازی را خود از ابتدا بسازیم، می بایست مجدد به Tab مربوط به Android Virtual Device رفته سپس روی گزینه New کلیک نماییم. اکنون بایستی مطابق تصویر زیر عمل کنیم:

    [​IMG]
    همانطور که در فوق مشاهده می شود، کلیه تنظیمات این پنجره همانند پنجره مربوط به ساخت ماشین مجازی در اکلیپس است به علاوه یکسری تفاوت که به توضیح تک تک آنها خواهیم پرداخت. نام انتخابی برای این ماشین مجازی را AndroidStudioAVD به معنی "ماشین مجازی اندروید استودیو" گذاشته شده و همانطور که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است با تیک دار کردن این گزینه ها می توان دکمه های سخت افزاری را روی این ماشین مجازی را نشان داد. در قسمت پایینی این پنجره همانطور که با یک فلش قرمز رنگ نشان داده شده است، اندروید استودیو اخطاری به ما داده مبنی بر اینکه "در سیستم عامل ویندوز، با انتخاب مقدار RAM بیش از 768 در حین اجرا با مشکل مواجه خواهید شد، از اینرو بایستی مقدار کمتری را وارد نمایید".

    همانطور که در تصویر فوق با یک کادر قرمز رنگ مشخص شده است، مقدار 1907 وارد شده است که بایستی این عدد به کمتر از 768 تقلیل یابد. بنابراین عدد کمتری مثل 500 را وارد می کنیم و تنظیمات ما به صورت زیر در خواهد آمد(مقدار مرتبط با RAM و SD Card بسته به سخت افزار کامپیوتری که با آن کار می کنیم می تواند تحت تاثیر قرار گیرد. در صورتیکه در حین اجرای Emulator با مشکل مواجه شدید می توانید این مقادیر را کاهش دهید):

    [​IMG]
    آپشن جدید که در پنجره مربوط به ساخت یک دستگاه مجازی در اندروید استودیو وجود دارد، گزینه مربوط به GPU است که در تصویر فوق با یک بیضی قرمز رنگ نشان داده شده است. به طور خلاصه می توان گفت که GPU مخفف واژگان Graphical Processing Unit به معنی "واحد پردازشگر گرافیکی" است. در واقع با تیک زدن این گزینه می توان شاهد تصاویر صاف تر بود. نکته ای که در ارتباط با تیک زدن این گزینه می بایست همواره مد نظر داشته باشیم این است که نمی توانیم به طور هم زمان هم گزینه Use Host GPU و هم گزینه Snapshot را تیک زد.

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

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. چرا زمانیکه یک ماشین مجازی ساخته شده در اندروید استودیو را در اکلیپس ویرایش کنیم، آن ماشین در اندروید استودیو از کار خواهد افتاد؟
    2. مزیت استفاده از ماشین های مجازی از پیش تعریف شده چیست؟
    3. کاربرد GPU در اندروید استودیو چیست؟
     
  3. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزشی برنامه نویسی اندروید- قسمت ۲۳: پنجره های مورد استفاده در برنامه نویسی در اندروید استودیو[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. معرفی بخش های مختلف محیط برنامه نویسی اندروید استودیو

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


    اگر خاطرمان باشد در اکلیپس جایی که می توانستیم از آن طریق به پروژه های خود دسترسی پیدا کنیم Package Explorer نامیده می شد. اما پنجره ای که در محیط اندروید استودیو این وظیفه را بر عهده دارد Project نامیده می شود که در تصویر زیر با یک کادر مستطیلی قرمز رنگ نشان داده شده است. به طور کلی می توان گفت که چیدمان فولدرها در اندروید استودیو نسبت به اکلیپس تا حدودی متفاوت است. به عبارت دیگر در محیط برنامه نویسی اکلیپس در زیرشاخه Root Directory یا همان "دایرکتوری اصلی" پروژه ای که ایجاد می کنیم، یک فولدر تحت عنوان src قرار دارد که کلیه پکیج ها و کلاس های جاوای اپلیکیشن ما در آن قرار دارند. فولدر res نیز در همین دایرکتوری اصلی قرار گرفته است.

    اما این در حالی است که ساختار فولدرهای تشکیل دهنده یک پروژه در اندروید استودیو تا حدودی متفاوت است. در حقیقت در اندروید استودیو در Root Directory یک دایرکتوری با همان نامی که برای پروژه خود انتخاب می کنیم وجود داشته سپس در همان دایرکتوری اصلی یک دایرکتوری دیگر با همان نام پروژه ای که داشتیم وجود دارد. در زیرشاخه دایرکتوری دوم فولدری تحت عنوان src وجود دارد که داخل آن یک فولدر دیگر به نام main به معنی "اصلی" وجود دارد. داخل فولدر main یک فولدر به اسم java وجود دارد که در برگیرنده کلیه پکیج ها و کلاس های جاوای اپلیکیشن است. علاوه بر فولدر java فولدر دیگر تحت عنوان res نیز در زیرشاخه فولدر main وجود داری که حاوی کلیه منابع مورد استفاده در اپلیکیشن است. برای روشن تر شدن مطالب فوق، تصویر زیر نشان دهنده کلیه این فولدرها در محیط اندروید استودیو است:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود فایل بسیار مهم AndroidManifest.xml نیز در زیرشاخه فولدر main قرار گرفته است. اگر این فایل را باز کنیم خواهیم دید که بر خلاف اکلیپس این فایل XML را فقط از طریق کدنویسی می توان ویرایش کرد و این در حالی است که در اکلیپس این فایل دارای پنج Tab مجزا از یکدیگر بود که چهارتای آنها دارای ظاهر گرافیکی بوده و فقط یک مورد از آنها امکان ویرایش کدنویسی را به ما می داد.

    برای آنکه بتوانیم یک فولدر جدید در زیرشاخه فولدر res ایجاد کنیم، تصویر زیر را مد نظر قرار داده و طبق آن عمل می کنیم:

    [​IMG]
    در واقع، روی فولدر res کلیک راست کرده سپس روی گزینه New کیک کرده و سپس همانطور که در تصویر فوق با یک بیضی قرمز رنگ نشان داده شده است روی گزینه Android resource directory کلیک می کنیم. پس از کلیک پنجره ای به شکل زیر باز خواهد شد:

    [​IMG]
    در این پنجره در بخش مربوط به Directory name به معنی "نام دایرکتوری" می بایست نام فولدری که می خواهیم بسازیم را وارد کنیم. به طور مثال قصد داریم که یک فولدر برای عکس ها با هر زرولوشنی ایجاد کنیم. برای این منظور نام از پیش تعیین شده drawable را وارد کرده و از بخش Resource type به معنی "نوع منبع ذخیره سازی" گزینه drawable را انتخاب می کنیم. به عبارت دیگر می بایست مابین چیزی که می خواهیم ایجاد کنیم و نوع آن چیز هماهنگی وجود داشته باشد.

    در محیط برنامه نویسی اندروید استودیو بخشی بسیار کاربردی تحت عنوان Available qualifiers اضافه شده است. در بخش مربوط به Available qualifiers به معنی "توصیف کننده های موجود" می توانیم گزینه مد نظر را انتخاب کرده و آن را به نامی که در مرحله پیش انتخاب کردیم ضمیمه کنیم. برای روشن شدن مطلب به مثال زیر توجه کنید:

    [​IMG]
    به طور خلاصه، با انتخاب گزینه Language به معنی "زبان" و سپس کلیک کردن روی دکمه ای که در تصویر فوق با یک کادر مستطیلی قرمز رنگ مشخص شده است می توانیم به توصیف کننده های مربوط به زبان های مختلف دنیا دست پیدا کنیم. به طور مثال fa:Persian را برای زبان فارسی انتخاب کرده و می بینیم که به محض انتخاب آن، پسوند fa با پس از قرار گرفته یک Dash به صورت خودکار به ادامه نام انتخابی ما اضافه خواهد شد.

    در این قسمت فقط نیاز داریم تا یک فولدر drawable ایجاد کنیم بنابراین به Available qualifiers کاری نداریم. حال پس از کلیک روی دکمه OK خواهیم دید که فولدر ساخته شده به لیست فولدر ها اضافه خواهد شد:

    [​IMG]
    کادری که در تصویر زیر با رنگ قرمز مشخص شده است جایی است که برای نمایش دادن فایل ها است خواه این فایل یک کلاس جاوا باشد خواه یک Layout از جنس XML در این کادر باز خواهد شد:

    [​IMG]
    در تصویر زیر گزینه Android در یک کادر مستطیلی قرمز رنگ مشخص شده است:

    [​IMG]
    با کلیک کردن روی این گزینه، به پنجره مربوط به Devices یا "دستگاه ها" و همچین پنجره مربوط به logcat دسترسی خواهیم داشت. اندروید استودیو نسبت به اکلیپس پیشرف خوبی کرده است به این شکل که اگر خاطرمان باشد پس از اتصال تلفن همراه به سیستم اکلیپس تلفن همراه بنده را در قالب یک id می شناخت اما این در حالی است که اندروید استودیو قادر گشته تا نام دستگاه های متصل شده به آن به همراه نسخه سیستم عامل اندروید نصب شده روی آنها را نیز تشخیص دهد(در آموزش های آتی با عملکرد پنجره logcat بیشتر آشنا خواهیم شد اما در این مرحله از آموزش همین قدر کافی است بدانیم که وظیفه logcat این است که خیلی سریع و آسان داده ها را مابین اپلیکیشن، دستگاه اندرویدی و محیط برنامه نویسی رد و بدل کند و اگر اپلیکیشن ما مشکلی داشت آن را نمایش دهد).

    نکته ای که برای بنده کمی عجیب به نظر می رسد این است که چرا گوگل به چیزی به این سادگی در حین طراحی اندروید استودیو توجه نکرده و آن هم این که مثلا عناوین کل پنجره ها مثل Devices با حرف بزرگ شروع شده اما پنجره logcat نه تنها با حرف بزرگ نوشته نشده است بلکه به صورت camelCase نیز در نیامده است. به هر حال می توان این مسائل را جزو Bug های بی اهمیت این محیط برنامه نویسی تلقی کرد(برای آشنایی بیشتر با اصطلاح camelCase به سری آموزش های جاوا در سایت نردبان قسمت دهم مراجعه نمایید).

    چنانچه یک فایل مرتبط با رابط گرافیکی کاربر یا همان GUI باز کنیم، خواهیم دید که پنجره مرتبط با بخش تنظیمات یا همان Properties نمایان خواهد شد:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، می توانیم تنها فایل مربوط به Layout پروژه که فایلی تحت عنوان activity_main.xml است را از زیرشاخه res داخل فولدری به نام layout قرار دارد را باز کنیم. پس از باز کردن این فایل همانطور که در تصویر فوق مشاهده می شود گزینه Designer به معنی "طراح" در یک کادر مستطیلی قرمز رنگ مشخص شده است. پس از کلیک روی آن به پنجره ای که در اکلیپس هم تحت عنوان Properties وجود داشت دست خواهیم یافت که در تصویر فوق با یک بیضی قرمز رنگ نشان داده شده است.

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. ساختار فولدرهای یک پروژه در اندروید استودیو چه تفاوتی با اکلیپس دارد؟
    2. مزیت محیط اندروید استودیو نسبت به اکلیپس برای اتصال دستگاه های واقعی چیست؟
    3. معادل پنجره Properties اکلیپس در محیط برنامه نویسی اندروید استودیو تحت چه عنوانی شناخته می شوند؟
     
  4. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۴: اصول طراحی Launcher Icon[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. آشنایی با Launcher Icon
    2. اهداف به کار گیری Launcher Icon
    3. باید ها و نباید ها در طراحی آیکان
    4. فرمت و اندازه آیکان برای صفحه نمایش های مختلف
    5. علت استفاده از Padding در طراحی آیکان

    [h=3]آشنایی با Launcher Icon[/h] پیش از فراگیری برنامه نویسی توسعه اندروید نیاز است تا برخی اصول طراحی در مراحل توسعه یک اپلیکیشن اندرویدی را فرا بگیریم. یکی از بخش های گرافیکی اصلی هر اپلیکیشن Launcher Icon یا همان آیکونی است که کاربران پس از نصب اپلیکیشن ما مشاهده خواهند کرد.

    ادامه مطلب را از دست ندهید.

    [​IMG]
    آنچه در تصویر فوق مشاهده می شود نمونه هایی از آیکون هایی می باشند که برای سیستم عامل اندروید طراحی شده اند. نکته ای که در مورد توسعه یک اپلیکیشن از اهمیت بسزایی برخودار می باشد این است که ما به عنوان یک توسعه دهنده می بایست برای کلیه صفحه نمایش ها با Density یا تراکم پیکسلی متفاوت یک آیکون مرتبط طراحی کنیم(برای آشنایی بیشتر با مفهوم Density به آموزش پانزدهم مراجعه نمایید). در واقع با اینکار اطمینان حاصل خواهیم کرد که کاربران با دستگاه هایی با Density متفاوت خواهند توانست اپلیکیشن ما را با کیفیت مناسبی روی دستگاه خود مشاهده نمایند.

    [h=3]اهداف به کار گیری Launcher Icon[/h] اهداف به کار گیری آیکان ها در یک اپلیکیشن بسیارند اما در اینجا به برخی از مهم ترین آنها اشاره خواهیم کرد که عبارتند از:

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

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

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

    [h=3]بایدها و نباید ها در طراحی آیکان[/h] نکته ای که همواره در طراحی آیکان می بایست مد نظر قرار داده شود این است که آیکان ها نباید داری پیچیدگی ها و ریزه کاری های فراوانی باشند. برای روشن شدن این مسئله به تصویر زیر توجه نمایید:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود تصویر سمت چپ نسبت به تصویر سمت راست دارای جزئیات به مراتب بیشتری است و از همین رو است که در ابعداد کوچک به وضوح قابل درک توسط کاربر نخواهد بود.

    همانطور که در مورد سوم از اهداف به کارگیری آیکان ها در قسمت بالا توضیح داده شد، تصویر بکار گرفته شده در آیکان نمی بایست تصویری Cropped شده یا بریده شده از یک تصویر بزرگ تر باشد:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، تصویر سمت چپ نسبت به تصویر سمت راست از جذابیت بصری کمتری برخوردار است.

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

    [​IMG]
    همانطور که در تصویر فوق می بینیم، چنانچه آیکان سمت چپ روی Background یی با رنگ سبز قرار گیرد، به دشواری خواهیم توانست که آنرا از پس زمینه تشخص دهیم و این در حالی است که اگر طرح سمت راست روی همان پس زمینه قرار گیرد این مشکل کمتر به نظر خواهد آمد.

    [h=3]فرمت و اندازه آیکان برای صفحه نمایش های مختلف[/h] به طور کلی فرمت آیکان اپلیکیشن های اندرویدی می بایست PNG سی و دو بیتی باشد. همانطور که قبلاً توضیح داده شد چهار نوع صفحه نمایش از دید میزان Density آنها وجود دارد و این در حالی است که هر اپلیکیشن اندرویدی برای کسب ظاهری با کیفیت تر می بایست دارای چهار نسخه در ابعاد مختلف برای هر یک از صفحه نمایش ها باشد تا چنانچه کاربرانی با دستگاه های مختلف از اپلیکیشن ما استفاده کردند تصویر با کیفیتی ببینند. جدول زیر نشانگر رابطه میزان Density با ابعدادی است که می بایست برای آیکان ها در نظر گرفت:

    [​IMG]
    همانطور که در جدول فوق ملاحظه می شود برای صفحه نمایشی با dpi پایین می بایست آیکانی به ابعداد 32 در 32 پیکسل، صفحه نمایشی با dpi متوسط آیکانی با ابعاد 48 در 48 پیکسل، صفحه نمایشی با dpi بالا آیکانی با ابعداد 72 در 72 پیکسل و در نهایت صفحه نمایشی با dpi بسیار بالا آیکانی با ابعداد 96 در 96 پیکسل داشته باشیم.

    اکنون با دانستن این ابعاد می توانیم نکته دیگری را هم مد نظر قرار داده و آن اینکه به منظور رعایت فاصله آیکان اپلیکیشن ما با دیگر آیکان ها می توانیم برای آیکان خود Padding در نظر بگیریم. مثلاً اگر بخواهیم آیکانی برای یک صفحه نمایش با Density متوسط طراحی کنیم با استفاده از نرم افزاری همچون فتوشاپ تصویری با پس زمینه Transparent یا شفاف با ابعداد 48 در 48 پیکسل ایجاد کرده و به منظور قرار دادن Padding از هر طرف تصویر خود مثلاً 4 پیکسل را خالی می گذاریم. به عبارت دیگر عکس ما دارای ابعاد 48 در 48 است اما فضای مفید استفاده شده از آن 40 در 40 می باشد.

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. هدف های عمده به کارگیری Launcher Icon در یک اپلیکیشن اندرویدی کدامند؟
    2. علت اینکه در طراحی آیکان نباید از طرح های بسیار باریک استفاده کنیم چیست؟
    3. برای ساخت یک آیکان از چه فرمت عکسی بایستی استفاده کنیم؟
    4. علت استفاده از Padding در طراحی آیکان چیست؟

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

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

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۵: استفاده از فتوشاپ جهت ساخت تمپلت برای Launcher Icon[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. آشنایی با محیط فتوشاپ
    2. نحوه ایجاد یک Launcher Icon در فتوشاپ

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

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

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

    برای شروع کار پس اجرای این نرم افزار همانطور که در تصویر زیر نشان داده شده است، از منوی اصلی گزینه File سپس گزینه New را انتخاب می کنیم:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، به جای اینکار می توان با فشردن هم زمان کلید های Ctrl و حرف N اقدام به ایجاد یک پروژه جدید کرد. پس از اینکار پنجره ای به شکل زیر مشاهده خواهد شد:

    [​IMG]
    همانطور که در پنجره فوق نشان داده شده است در بخش Name به معنی "نام" عبارت ic_launcher را وارد می کنیم(لازم به ذکر است که این نام کاملاً اختیاری است). در بخش Width و Height که به ترتیب "عرض" و "طول" معنی می دهند عدد 96 را وارد کرده و این در حالی است که واحد انتخابی هر دو آنها بایستی Pixel باشد. در بخش Background Contents به معنی "محتویات پس زمینه" از میان گزینه های موجود مورد Transparent به معنی "شفاف، واضح و یا خالی" را انتخاب می کنیم(علت انتخاب این گزینه این است که زمانیکه می خواهیم Padding برای آیکان خود در نظر بگیریم، نواحی حاوی Padding بدون رنگ و شفاف باشند).

    همانطور که قبلا توضیح داده شد صفحه های نمایش به طور کلی دارای چهار Density یا "تراکم" مختلف هستند. حال سوالی که ممکن است در اینجا به ذهن خطور کند این است که چرا ما در ابتدا اقدام به ساخت آیکان برای صفحه نمایشی با تراکم بسیار بالا یا به عبارتی صفحه نمایش xhdpi کردیم. در پاسخ به این سوال بایستی گفت که با اینکار مراحل ساخت آیکان را برای خود کاهش خواهیم داد. فرض کنیم که در ابتدا آیکانی به ابعاد 36 در 36 برای صفحه نمایشی با تراکم پایین یا به عبارتی ldpi ایجاد می کنیم. حال اگر بخواهیم پس از تکمیل طراحی، ابعداد تصویر را به طور مثال به 48 در 48 برای mdpi افزایش دهیم، کیفیت آیکان ما تا حدودی کاهش پیدا خواهد کرد و این مسئله در مورد افزایش سایز آیکان به 96 در 96 به مراتب مشهود تر می باشد. اما عکس این قضیه صادق نیست. یعنی اگر در ابتدا آیکانی به ابعاد 96 در 96 پیکسل ایجاد کنیم سپس طرح اولیه را به ترتیب به ابعاد 72 در 72 سپس 48 در 48 و در نهایت به 36 در 36 پیکسل کاهش دهیم، می توانیم انتظار نتایج به مراتب مطلوب تری داشته باشیم.

    اکنون با دانستن این نکات می توانیم روی گزینه OK کلیک کرده و تصویر ایجاد شده را مشاهده کنیم:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود یک تصویر با ابعاد 96 در 96 پیکسل ایجاد شده و از آنجا که در پروسه ساخت این تصویر گزینه Transparent را انتخاب کردیم، یک تصویر بدون رنگ خواهیم داشت.

    همانطور که در آموزش پیش توضیح دادیم، برای آنکه آیکان اپلیکیشن ما در کنار دیگر آیکان ها خوب جلوه دهد نیاز داریم تا مقداری Padding برای آن در نظر بگیریم. برای این منظور از نوار ابزارها که در سمت چپ فتوشاپ قرار دارد Rectangle Tool یا "ابزار ترسیم مستطیل" را انتخاب می کنیم. پس از انتخاب این ابزار نشانگر موس خود را روی صفحه خالی ایجاد شده قرار داده و دو بار پشت سر هم کلیک می کنیم و سپس پنجره ای به صورت زیر را مشاهده خواهیم کرد:

    [​IMG]
    در این پنجره می توانیم طول و عرض شکلی که می خواهیم ایجاد کنیم را تعریف کنیم. به طور مثال در این آموزش عدد 4 پیکسل را برای هم طول و هم عرض شکل خود در نظر می گیریم. پس زدن گزینه OK تصویر زیر را مشاهده خواهیم کرد:

    [​IMG]
    می بینیم که یک مربع قرمز رنگ با ابعداد 4 در 4 پیکسل ایجاد شده است. در حقیقت هدف از ایجاد این مربع این است تا از طریق آن بتوانیم از هر چهار طرف تصویر خود 4 پیکسل فضای خالی ایجاد کنیم. برای ادامه کار مربع ایجاد شده را در منتها الیه سمت چپ تصویر قرار می دهیم:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، سپس نشانگر موس خود را در بخش Rulers به معنی "خط کش ها" قرار داده کلیک می کنیم و نشانگر موس خود را به سمت راست می کشیم و خواهیم دید که با حرکت موس خود به سمت راست یک خط عمودی فرضی ایجاد می شود. حال موس خود را تا جایی به سمت راست می کشیم تا با ضلع سمت راست مربع قرمز رنگ مماس شود. اکنون پس از اطمینان حاصل کردن از مماس بودن خط فرضی با ضلع سمت راست مربع دکمه موس خود را رها می سازیم و خواهیم دید که یک خط عمودی شبرنگ ایجا می گردد:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود با استفاده از ابزار Move Tool به معنی "ابزار جابجایی" مربع قرمز رنگ را به منتها الیه سمت راست تصویر خود کشیده سپس به روش قبل یک خط شبرنگ دیگر یا به اصطلاح یک Guide دیگر مماس با ضلع سمت چپ مربع می کشیم. همین روش را برای قرار دادن Guide های بالایی و پایینی هم تکرار می کنیم و در نهایت تصویر ما به صورت زیر در خواهد آمد:

    [​IMG]
    از آنجا که دیگر به مربع قرمز رنگ در طراحی خود نیازی نداریم، به صورت زیر آن را از تصویر خود حذف می کنیم:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود، در پنجره Layers به معنی "لایه ها" که با یک بیضی قرمز رنگ نشان داده شده است شکلی تحت عنوان Rectangle 1 ایجاد شده است که در کنار آن یک عکس چشم دیده می شود که در تصویر فوق با یک دایره قرمز رنگ نشان داده شده است. با کلیک کردن روی عکس چشم این امکان را خواهیم داشت تا شکلی را به صورت موقت از روی صفحه نمایش پنهان سازیم. حال روی عکس چشم کلیک کرده و مربع قرمز رنگ را از صفحه پنهان می سازیم:

    [​IMG]
    می بینیم که شکل حذف شده و فقط Guide های شبرنگ روی صفحه باقی مانده اند. به طور خلاصه می توان گفت که در خروجی گرفتن از فتوشاپ با هر فرمتی این Guide ها چاپ نخواهند شد و صرفاً جهت مشخص سازی نقاطی از تصویر می باشند.

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

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. چرا در حین ساخت یک فایل جدید در فتوشاپ به منظور طراحی یک آیکان گزینه Transparent را تیک می زنیم؟
    2. هدف از ایجاد Guide ها چیست؟
    در آموزش بیست و ششم با نحوه جایگزینی آیکان های جدید در اولین پروژه خود و همچنین تست کردن اپلیکیشن آشنا خواهیم شد.
     
  6. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۶: شخصی سازی Launcher Icon اولین اپلیکیشن[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. نحوه ایجاد آیکانی شخصی برای Density های مختلف
    2. جایگزین کردن عکس های ایجاد شده با عکس پیش فرض اکلیپس

    در آموزش بیست و پنجم با نحوه ایجاد یک Template با تعدادی Guide به منظور ایجاد Padding آشنا شدیم. حال در این آموزش قصد داریم تا آیکان هایی برای انواع صفحه نمایش با Density هایی متفاوت طراحی کنیم.

    اگر خاطرمان باشد در آموزش هشتم پروژه خود را My First Android Project به معنی "اولین پروژه اندروید من" نامیدیم. حال اگر بخواهیم تصویری مرتبط با اولین پروژه طراحی کنیم که هم اصول طراحی در آن رعایت شده باشد و در عین حال جذاب، گیرا و تاثیرگذار هم باشد، به نظر می رسد از یک سو چند قسمت آموزش را به خود اختصاص دهد و از سوی دیگر کمی از هدف این سری از آموزش ها که بیشتر با رویکرد برنامه نویسی طراحی شده اند فاصله خواهیم گرفت. برای همین منظور به طرحی کاملاً ساده بسنده خواهیم کرد:

    [​IMG]
    به طور مثال همانطور که در تصویر فوق ملاحظه می شود شکلی آبی رنگ در نظر گرفته شده است. فقط نکته ای که حتما می بایست مد نظر قرار داده شود این است که لبه های شکل ما از Guide های ترسیم شده بیرون نزند.

    همانطور که در آموزش پیش توضیح داده شد، فرمت آیکان های اندروید می بایست PNG سی و دو بیتی باشد، از این رو نیاز داریم تا این تصویر را با فرمت PNG ذخیره سازیم.

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، از منوی اصلی گزینه File سپس گزینه Save As را انتخاب می کنیم سپس پنجره ای به شکل زیر مشاهده خواهیم کرد:

    [​IMG]
    در این پنجره در بخش File name به معنی "نام فایل" نام ic_launcher که در پروسه ساخت فایل وارد نمودیم آمده است. در بخش Format همانطور که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است فرمت PNG را انتخاب می کنیم. همانطور که قبلا گفته شده قصد داریم تا این آیکان را جایگزین آیکانی کنیم که خود نرم افزار اکلیپس به صورت پیش فرض برای پروژه ما ساخته است، از این رو پیش از زدن دکمه Save می بایست مسیر ذخیره سازی را به مسیری که در ابتدای نصب اکلیپس برای workspace در نظر گرفتیم، سپس فولدر My First Android Project سپس فولدر res و در نهایت فولدر drawable-xhdpi تغییر داده حال می توانیم دکمه Save را کلیک نماییم(در واقع علت اینکه فولدر drawable-xhdpi را انتخاب کردیم این بود که ابعاد تصویر ما برای صفحه نمایش هایی با تراکم xhdpi می باشد و این فولدر هم مسئول ذخیره سازی تصاویر برای این گروه از صفحه نمایش ها می باشد):

    [​IMG]
    پس از کلیک کردن دکمه Save خواهیم دید که پنجره ای به صورت فوق نمایان می شود که در این صورت تنظیمات پیش فرض را مد نظر قرار داده و دکمه OK را کلیک می کنیم.

    اکنون نیاز داریم تا آیکان هایی برای Density هایی معادل با hdpi و mdpi و ldpi به ترتیب با ابعاد 72 در 72 و 48 در 48 و 36 در 36 ایجاد کنیم. برای این منظور ابتدا از hdpi شروع کرده و عکس طراحی شده را به ابعاد 72 در 72 کاهش می دهیم. برای این منظور می بایست به طور هم زمان دکمه های Ctrl و Alt و حرف I را فشار دهیم و خواهیم دید که پنجره ای به شکل زیر باز خواهد شد:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود در بخش Width و Height عدد 96 وارد شده است. در همین تصویر گزینه Constrain Proportions با یک بیضی قرمز رنگ نشان داده شده است. در صورتیکه این گزینه تیک دار باشد، ابعداد طول و عرض تصویر ما به صورت متناسب با یکدیگر بزرگ و کوچک خواهند شد اما از آنجا که تصویر ما یک مربع است، هر عددی که برای Width یا همان عرض تصویر در نظر بگریم برای Height یا همان طول تصویر نیز در نظر گرفته خواهد شد. حال مقابل Width عدد 72 را وارد کرده و خواهیم دید که عدد مقابل Height به صورت خودکار از عدد 96 به 72 تغییر پیدا می کند. اکنون گزینه OK را کلیک می کنیم و خواهیم دید که تصویر ما به ابعاد 72 در 72 در خواهد آمد. حال مجدد همچون مراحل قبل این فایل را Save کرده اما این بار محل ذخیره سازی را داخل فولدر res درون فولدر drawable-hdpi در نظر می گیریم و به محض کلیک کردن گزینه Save با تصویر زیر مواجه خواهیم شد:

    [​IMG]
    در واقع همانطور که در تصویر فوق مشاهده می شود داخل فولدر drawable-hdpi فایلی تحت عنوان ic_launcher.png وجود دارد که اکلیپس به طور خودکار درحین ساخت پروژه ایجاد کرده است و از آنجا که نام انتخابی ما برای آیکان جدید با نام آیکان پیش فرض یکی است، همانطور که در تصویر فوق با کادری قرمز رنگ نشان داده شده است این اخطار به ما داده می شود که "فایلی با همین نام در این فولدر وجود دارد. آیا می خواهید آن را با فایل جدید جایگزین کنید؟" که پاسخ ما به این سوال بلی بوده از این رو روی گزینه OK کلیک می کنیم.

    به همین روش یکبار دیگر تصویر خود را به ابعاد 48 در 48 درآورده سپس آنرا در فولدر drawable-mdpi ذخیره می سازیم. در نهایت تصویر خود را به اندازه 36 در 36 در آورده و آن را جایگزین تصویری می کنیم که در فولدر drawable-ldpi قرار دارد.

    حال این سوال ممکن است پیش آید که تنها فولدری که به صورت پیش فرض در آن آیکان ایجاد نشده بود فولدر drawable-xhdpi است و این در حالی است که مابقی فولدرها دارای آیکانی مرتبط با Density آن فولدر بودند و می بایست آیکان جدید را جایگزین آیکان های قبلی کرد. در پاسخ به این سوال بایستی گفت که اگر خاطرمان باشد در آموزش هشتم در حین ساخت اولین پروژه خود سه فولدر drawable-ldpi و drawable-mdpi و drawable-hdpi به صورت خودکار توسط اکلیپس برای ما ایجاد شدند و بالتبع داخل آنها هم آیکانی مرتبط با Density آنها ایجاد شد اما این در حالی است که فولدر drawable-xhdpi اصلا وجود خارجی نداشت و ما آن را در آموزش چهاردهم به منظور پشتیبانی از دستگاه هایی با صفحه نمایشی با Density بسیار بالا ایجاد کردیم. از همین رو است که هیچ آیکانی در آن قرار نداشت.

    اکنون نیاز داریم تا اپلیکیشن خود را تست کنیم اما با موضوعی در اینجا مواجه می شویم که غفلت از آن نتایج متفاوتی را برای ما در بر خواهد داشت. اگر در حین طراحی آیکان جدید محیط برنامه نویسی اکلیپس باز بوده باشد و ما آیکان جدید را در سه فولدر drawable-ldpi و drawable-mdpi و drawable-hdpi جایگزین کرده باشیم، حتما نیاز است که اکلیپس را از این موضوع مطلع سازیم اما در صورتیکه نرم افزار اکلیپس بسته بوده باشد و پس از اتمام کار آن را اجرا کنیم دیگر نیازی به این کار نخواهد بود.

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

    [​IMG]
    به طور خلاصه، روی پروژه خود کلیک راست نموده سپس همانطور که در تصویر فوق ملاحظه می شود گزینه Refresh به معنی "تازه کردن" را کلیک می کنیم. حال در صورتیکه پروژه خود را روی Emulator اجرا کنیم و به صفحه اپلکیشین ها روی Emulator برویم تصویر زیر را مشاهده خواهیم کرد:

    [​IMG]
    همانطور که در تصویر فوق با یک دایره قرمز رنگ نشان داده شده است، تصویر آیکان اولین پروژه ما از تصویر پیش فرض اندروید به تصویر آیکان جدید تغییر پیدا کرد.

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. چرا در مورد فولدر drawable-xhdpi نیاز به جایگزین کردن آیکان نبود؟
    2. چنانچه در حین طراحی آیکان های شخصی و همچنین جایگزین کردن آنها نرم افزار اکلیپس باز باشد به چه طریقی می توانیم این موضوع را به محیط برنامه نویسی اکلیپس اطلاع دهیم؟
     
  7. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید- قسمت ۲۷: اجزای تشکیل دهنده Activity یک اپلیکیشن[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. بررسی بخش های مختلف کدهای جاوا در یک اپلیکیشن اندروید
    2. آشنایی با کلاس های Activity و Bundle
    3. آشنایی با متد onCreate

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

    برای این منظور پروژه ای که در آموزش هشتم ساختیم را در محیط برنامه نویسی اکلیپس باز نموده و از زیرشاخه پروژه ای که تحت عنوان My First Android Project ساخته بودیم، فولدر src را انتخاب نموده سپس از زیر مجموعه پکیج موجود فایل جاوای MainActivity را همانطور که در تصویر زیر با یک بیضی قرمز زنگ مشخص شده است را انتخاب می کنیم. با دو بار کلیک کردن روی نام این فایل خواهیم دید که در این فایل در محیط اکلیپس باز شده و کدهای داخل آن را در ادامه مطلب خواهیم دید:

    [​IMG]
    اکنون کدی مشابه کد زیر خواهیم داشت:



    • package com.behzadmoradi.mainpackage;
    • import android.app.Activity;
    • import android.os.Bundle;
    • public class MainActivity extends Activity {
    • /** Called when the activity is first created. */
    • @Override
    • public void onCreate(Bundle savedInstanceState) {
    • super.onCreate(savedInstanceState);
    • setContentView(R.layout.main);
    • }
    • }

    اولین خط از کد فوق مربوط به نام پکیجی است که در حین ساخت پروژه تعریف می کنیم. در واقع وظیفه این پکیج جای دادن کلیه فایل های جاوا است که در حین ساخت یک اپلیکیشن ایجاد خواهیم کرد(برای آشنایی بیشتر با نحوه نامگذاری پکیج ها در اندروید، به آموزش چهارم مراجعه نمایید). پس از این خط دو خط کد دیگر وارد برنامه شده است که با کلید واژه import آغاز شده اند. به طور کلی این دو خط کد وظیفه دارند تا پکیج های مورد نیاز برای توسعه یک اپلیکیشن را به پروژه ما import یا "وارد" کنند که در ادامه به توضیح مفصل پیرامون هر یک از آنها خواهیم پرداخت.

    در حقیقت کلاس Activity به عنوان مهم ترین کلاس در ساخت یک اپلیکیشن اندرویدی است زیرا همانطور که قبلا توضیح داده شد در یک اپلیکیشن اندرویدی هر چیزی با یک Activity آغاز می شود و از همین رو است که کلاس اصلی که برای یک اپلیکیشن در حین ساخت یک پروژه تعریف می کنیم خصوصیاتی را از کلاس Activity به ارث می برد. به عبارت دیگر کد MainActivity extends Activity حاکی از آن است که کلاس MainActivity که در پروسه ساخت پروژه خود ایجاد کردیم برگرفته از کلاس Activity است، به عبارت دیگر از کلاس Activity که توسط برنامه نویسان سیستم عامل اندروید نوشته شده است ارث بری می کند.

    از آنجا که ما نیاز داریم تا بارها و بارها از کلاس Activity در اپلیکیشن خود استفاده کنیم، نیاز است تا این کلاس را از طریق کد import android.app.Activity; به پروژه خود وارد کنیم(لازم به ذکر است که می توانیم این کلاس را وارد برنامه نکرده و هر جا که خواستیم از این کلاس استفاده کنیم آدرس کامل آن را بنویسیم. به طور مثال در این پروژه می توانیم کدMainActivity extends android.app.Activity; را به اپلیکیشن خوداضافه کنیم اما این در حالی است که با اتخاذ این رویکرد می بایست کد بیشتری بنویسم که به نظر می رسد این کار منطقی نباشد(به منظور درک بهتر مبحث وارثت در زبان برنامه نویسی جاوا، به آموزش های سی دوم و سی سوم دوره آموزش برنامه نویسی جاوا در سایت نردبان مراجعه نمایید).



    • @Override
    • public void onCreate(Bundle savedInstanceState) {
    • super.onCreate(savedInstanceState);
    • setContentView(R.layout.main);
    • }

    کلاس Activity در برگیرندۀ متدهای فراوانی است که یکی از آنها همین متد onCreate است که در کد فوق مشاهده می شود. به طور کلی می توان گفت زمانیکه یک Activity ساخته می شود، چندین متد فراخوانده می شوند که اولین آنها متد onCreate است که با استفاده از آن خواهیم توانست هر کاری که تمایل داشته باشیم را اجرا کنیم. به طور مثال در این پروژه پس از فرا خواندن این متد قادر خواهیم شد تا GUI یا "همان رابط گرافیکی کاربر" برنامه که در طریق XML ساخته می شود و در فولدر layout که زیرمجموعه فولدر res می باشد و نام آن main.xml است را اجرا نماییم.

    در زبان برنامه نویسی جاوا می توانیم متدهای مرتبط با کلاسی مثل کلاس Activity که کلاس دیگری مثل کلاس MainActivity از آن ارث بری شده است را بسته به نیاز خود Override یا "بازنویسی" کنیم تا کد مد نظر خود را در آن اجرا کنیم(برای کسب اطلاعات بیشتر در مورد مفهوم Override به سری آموزش های زبان برنامه نویسی جاوا در سایت نردبان قسمت سی و دوم مراجعه نمایید).

    زمانیکه متدی را Override می کنیم دو گزینه پیش روی ما است:

    1. اول اینکه می توانیم کلیه خصوصیات اولیه متد مد نظر که توسط برنامه نویسان سیستم عامل اندروید ایجاد شده را بازنویسی کنیم و یا

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

    به عبارت دیگر زمانیکه از کلید واژه super در کد خود استفاده می کنیم، این دستور را به ماشین مجازی جاوا یا همان Dalvik VM می دهیم تا علاوه بر کدهای موجود در کلاس مرتبط با متد onCreate ،کدهای مد نظر ما را نیز اجرا نماید. در حقیقت اگر کد super.onCreate(savedInstanceState); را از اپلیکیشن خود حذف کنیم این دستور را به ماشین مجازی می دهیم که فقط کد بازنویسی شده ما را اجرا کند و به هیچ وجه کدهای مرتبط با کلاس Activity که در برگیرندۀ متد onCreate است را مد نظر قرار ندهد. اما نکته اینجا است که به هر حال این خط از کد برای اجرای اپلیکیشن الزامی است چرا که برای اجرای یک اپلیکیشن به طور کامل و بدون نقص به کدهای نوشته شده توسط برنامه نویسان سیستم عامل اندروید برای متد onCreate نیاز داریم(برای آشنایی بیشتر با دستور super به سری آموزش های زبان برنامه نویسی جاوا در سایت نردبان قسمت چهل و دوم مراجعه نمایید).

    همانطور که در کد فوق ملاحظه می شود، داخل پرانتز مقابل متد onCreate مرتبط با کلاس Avtivity یک پارامتر قرار گرفته است. در کد فوق مشاهده می شود که داخل پرانتز مقابل متد onCreate پارامتر Bundle savedInstanceState قرار گرفته است. این پارامتر شیئی تحت عنوان savedInstanceState است که از روی کلاس Bundle ساخته شده است. وظیفه ای که این پارامتر بر عهده دارد این است تا این امکان را به توسعه دهنده بدهد تا بتواند Value ها یا "مقادیری" را در اپلیکیشن خود ذخیره سازد(لازم به ذکر است نام savedInstanceState اختیاری بوده و به صورت خودکار توسط خود اکلیپس ایجاد می شود).

    حال از آنجا که شیئی از روی کلاس Bundle ساخته و آن را در پروژه خود مورد استفاده قرار داده ایم پس نیاز است تا کد import android.os.Bundle; را به پروژه خود خود import کنیم که اینکار به صورت خودکار توسط محیط برنامه نویسی اکلیپس انجام خواهد شد.

    در نهایت به متد setContentView(); می رسیم که این وظیفه را دارا است تا هرآنچه داخل آن قرار گرفت را به نمایش در آورد. در حقیقت با قرار دادن کد R.layout.main داخل پرانتز مقابل این متد این دستور را به ماشین مجازی می دهیم تا فایلی تحت عنوان main.xml که داخل فولدر layout که زیرمجموعه فولدر res قرار دارد را به نمایش در آورد. منظور از R هم فایلی است که در زیرشاخه فولدر gen قرار دارد. چنانچه این فایل را باز کنیم کدی به شکل زیر مشاهده خواهیم کرد:

    [​IMG]
    همانطور که در تصویر فوق در کادر قرمز رنگ مشاهده می شود، یک id برای layout یی تحت عنوان main در نظر گرفته شده است که از طریق همین id است که به فایل XML یی تحت عنوان main دسترسی پیدا خواهیم کرد(برای کسب اطلاعات بیشتر پیرامون فایل R به آموزش نهم مراجعه نمایید).

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. علت وارد کردن کلاس Activity به یک اپلیکیشن اندرویدی چیست؟
    2. اولین متدی که از کلاس Activity در یک اپلیکیشن مورد استفاده قرار می گیرد چیست؟
    3. علت استفاده از دستور super چیست؟
    4. حرف R به چه چیزی اشاره دارد؟

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

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۸: آشنایی با فایل XML در طراحی رابط کاربری اپلیکیشن[/h] اهداف آموزشی این قسمت عبارتند از:
    1. معرفی XML
    2. علت به کارگیری XML در توسعه اندروید
    3. معرفی اجزای تشکیل دهنده یک layout در اپلیکیشن اندرویدی
    4. آشنای با استاندارد UTF-8
    5. معرفی namespace
    6. نحوه نامگذاری namespace در سیستم عامل اندروید

    پس از آشنایی با بخش های تشکیل دهنده یک Activity اصلی در اپلیکیشن های اندرویدی، در این آموزش قصد داریم تا با اجزای تشکیل دهندۀ یک فایل XML که تشکیل دهندۀ layout در اپلیکیشن ها است آشنا شویم.

    [h=3]XML چیست؟[/h] واژه XML مخفف واژگان Extensible Markup Language به معنی "زبان نشانه گذاری قابل گسترش" است. این زبان برخلاف HTML که به منظور نمایش داده ها مورد استفاده قرار می گیرد، برای ذخیره سازی و انتقال داده به کار گرفته می شود. شاید از دلایلی که از XML برای برنامه نویسی layout در توسعه اندروید استفاده شده است بتوان به گسترش پذیری آن، سهولت استفاده، خوانایی آن هم توسط انسان و هم توسط سیستم اشاره کرد. از سوی دیگر یک رابط گرافیکی کاربر یا همان GUI که توسط XML ایجاد شده باشد به سادگی قابل تحلیل و نمایش دادن است اما این در حالی است که اگر دیگر زبان ها در ساخت یک GUI استفاده می شد، تحلیل و Compile و اجرای آن به مراتب نسبت به یک فایل XML پیچیده تر می بود.

    [h=3]معرفی اجزای تشکیل دهنده layout اولین پروژه اندروید[/h] به منظور درک کامل XML بهتر است layout پروژه ای که در آموزش هشتم تحت عنوان My First Android Project ساختم را مورد بررسی قرار دهیم. برای این منظور فایل main.xml که زیرشاخه layout در فولدر res قرار دارد را باز می کنیم:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، پس از باز کردن فایل main.xml در پایین صفحه با دو گزینه متفاوت رو به رو خواهیم گشت: گزینه اول که با یک بیضی قرمز رنگ نشان داده شده است Graphical Layout به معنی "ساختار گرافیکی" است که نمود گرافیکی یک فایل xml را نشان می دهد. در حقیقت اگر این گزینه انتخاب شده باشد ساختاری مشابه با همان چیزی را خواهیم دید که در یک دستگاه واقعی نمایش داده خواهد شد. گزینه دوم main.xml است که با یک بیضی سبز رنگ نشان داده شده است. در واقع با کلیک کردن روی این گزینه به کدهای XML تشکیل دهنده layout دسترسی پیدا خواهیم کرد:



    • <?xml version="1.0" encoding="utf-8"?>
    • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:orientation="vertical" >
    • <TextView
    • android:layout_width="fill_parent"
    • android:layout_height="wrap_content"
    • android:text="@string/hello" />
    • </LinearLayout>

    به محض کلیک کردن روی گزینه main.xml با کدی مشابه کد فوق رو به رو خواهیم شد. خط اول نشانگر شماره نسخه XML است که معادل با 1.0 می باشد و از سوی دیگر نوع رمزگذاری آن معادل با UTF-8 می باشد. UTF مخفف واژگان Unicode Transformation Format به معنی "فرمت تبدیل یونیکد" می باشد(لازم به ذکر است که یونیکد به منزله استانداردی است که از طریق آن کاراکترها و اعداد و علائم در اکثر زبان ها نشان داده می شود). عدد 8 حاکی از آن است که این استاندارد از 8 بیت حافظه برای ذخیره سازی یک کاراکتر استفاده می کند.



    • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:orientation="vertical" >
    • </LinearLayout>

    کدی که در قسمت فوق ملاحظه می شود به منزلۀ کد اصلی است که مسئول ساخت layout می باشد. کلید واژه LinearLayout به ساختار layout ما اشاره دارد که ساختاری خطی است. به عبارت دیگر عناصری که روی این layout قرار می گیرند به صورت خطی یکی پس از دیگری یا از بالا به پایین و یا از چپ به راست در کنار یکدیگر قرار می گیرند. دستور xmlns:android=http://schemas.android.com/apk/res/android یک namespace به معنی "فضای نام" است که این وظیفه را بر عهده دارد تا از تداخل Tag هایی که دارای شناسه هایی یکسان می باشند جلوگیری به عمل آورد.

    [h=3]namespace چیست؟[/h] برای روشن شدن این مطلب نیاز است تا مثالی دیگری ذکر کنیم. کد زیر حاوی اطلاعات یک جدول در HTML است:



    • <table>
    • <tr>
    • <td>Apples</td>
    • <td>Bananas</td>
    • </tr>
    • </table>

    در این آموزش قصد نداریم تا Tag های زبان HTML را مورد بررسی قرار دهیم اما همین قدر لازم است بدانیم که تگ های
    و [TABLE]
    [/TABLE]
    مسئول ساخت یک جدول در HTML می باشند. حال به کد زیر هم نگاهی می اندازیم:


    • <table>
    • <name>Room</name>
    • <width>5</width>
    • <length>8</length>
    • </table>

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

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



    • <a: table>
    • < a: tr>
    • < a: td>Apples</a: td>
    • < a: td>Bananas</a: td>
    • < /a: tr>
    • < /a: table>
    • <b: table>
    • < b: name>Room</b: name>
    • < b: width>5</b: width>
    • < b: length>8</b: length>
    • < /b: table>

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

    اما نکته ای که در اینجا حائز اهمیت است این است که هر موقع که در کدهای XML خود از یک پیشوند استفاده می کنیم نیاز است تا یک namespace یا همان "فضای نام" را برای پیشوند خود تعریف کنیم. به طور کلی namespace با قرار دادن دستور xmlns در اولین Tag ایجاد می گردد. ساختار کلی namespace به صورت xmlns:prefix="URI" است به این صورت که پس از دستور xmlns یک علامت : قرار داده سپس پیشوندی که قصد داریم از طریق آن Tag را از یکدیگر مجزا سازیم را نوشته که در مثال های فوق ما از پیشوندهای a و b استفاده کردیم سپس یک علامت مساوی قرار داده و مقابل آن آدرس یک URL را داخل علامت های “ “ قرار می دهیم. در حقیقت اگر بخواهیم کدهای ادغام شده فوق را با نوشتن namespace تکمیل کنیم می بایست کدهای ما به شکل زیر باشند:



    • <a: table xmlns:a="http://www.w3.org/TR/html4/">
    • < a: tr>
    • < a: td>Apples</a: td>
    • < a: td>Bananas</a: td>
    • < /a: tr>
    • < /a: table>
    • <b: table xmlns:b="http://www.w3schools.com/furniture"
    • < b: name>Room</b: name>
    • < b: width>5</b: width>
    • < b: length>8</b: length>
    • < /b: table>

    حال با قرار دادن دو namespace یکی برای پیشوند a و دیگری برای پیشوند b یک نوع یکنواختی را در کد خود ایجاد کرده زیرا زمانیکه یک namespace برای یک عنصر اصلی که در اینجا
    است ایجاد می کنیم، کلیه عناصر زیرشاخه آن نیز از همان namespace تبعیت خواهند کرد.استاندارد نامگذاری Namespace به این شکل است که نامی به شکل آدرس یک URL برای آن در نظر گرفته می شود و علت آن هم ایجاد نامی منحصر به فرد است و در صورتیکه مثلا آدرس http://www.w3schools.com/furniture را در یک مرورگر وب تایپ کنیم به طور حتم با پیغام 404 – The page cannot be found به معنی "این صفحه قابل یافتن نیست" مواجه خواهیم شد زیرا این آدرس حاوی هیچ گونه اطلاعاتی نمی باشد. لازم به ذکر است که این نام همواره می بایست به همین شکلی که ملاحظه می کنیم باشد و در صورتیکه آن را تغییر دهیم اپلیکیشن ما با مشکل مواجه خواهد شد.

    اکنون که با مفهوم namespace آشنا شدیم مجدد به کد خود نگاهی خواهیم انداخت: [TABLE]
    [/TABLE]



    • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:orientation="vertical" >
    • </LinearLayout>

    در کد فوق برای Tag مرتبط با یک namespace ایجاد شده است به این صورت که پس از دستور xmlns یک علامت : قرار گرفته و در آن پیشوند android تعریف شده سپس یک علامت مساوی قرار گرفته و مقابل آن داخل علامت های “ “ آدرس URL یی که در کد فوق ملاحظه می شود گنجانده شده است. در حقیقت این آدرس به "ناکجا آباد" خواهد رفت و به عبارت دیگر وجود خارجی ندارد علیرغم اینکه این آدرس وجود ندارد اما این در حالی است که این آدرس برای توسعه فایل های XML اندروید به عنوان یک استاندارد در آمده و نمی بایست آن را تغییر داد. در این مثال از پیشوند android در Tag اصلی استفاده شده است و همانطور که می بینیم در Tag های زیرشاخه Tag اصلی اول نام این پیشوند آمده سپس یک علامت : قرار گرفته و سپس نام Tag نوشته شده است.

    وظیفه Tag مرتبط با layout_width تعیین عرض صفحه است و وظیفه Tag مرتبط با layout_height تعیین ارتفاع صفحه می باشد و مقدار در نظر گرفته شده برای این دو Tag معادل با fill_parent می باشد. معادل مقدار fill_parent مقدار match_parent می باشد و این دو هیچ فرقی با یکدیگر ندارند و علت وجود این دو مقدار با عملکردی یکسان این است که شرکت گوگل پس از توسعه API 8 نام fill_parent را به match_parent تغییر داد تا ماهیت آن تا حدودی گویاتر شود(از آنجا که API به کار گرفته شده در این اپلیکیشنی که در آموزش هشتم ایجاد کردیم 2.1 است و به عبارت دیگر7 API است از مقدار fill_parent استفاده شده است). به طور کلی می توان گفت که fill_parent یا match_parent این وظیفه را بر عهده دارند تا کل فضای بیرونی صفحه ای که در آن قرار دارند را اشغال کنند. به عبارت دیگر زمانیکه مقدار Tag های layout_width و layout_height معادل با fill_parent یا match_parent باشد، این دستور را به اندروید می دهیم که این رابط گرافیکی کاربر که ایجاد می کنیم می بایست کل صفحه نمایش دستگاه را شامل شود.

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. علت استفاده از زبان XML در توسعه اندروید چیست؟
    2. عدد 8 در عبارت UTF-8 به چه چیزی اشاره دارد؟
    3. چرا در توسعه UI از namespace استفاده می کنیم؟
    4. آدرس موجود در namespace به کدام سایت اینترنتی اشاره دارد؟
    5. فرق مابین fill_parent و match_parent چیست؟
    6. چرا در این پروژه ای که ایجاد کرده ایم از مقدار fill_parent استفاده شده است؟

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

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید - قسمت ۲۹: بررسی TextView[/h]
    اهداف آموزشی این قسمت عبارتند از:
    1. معرفی TextView در ساخت یک UI
    2. تفاوت مقادیر fill_parent و wrap_content
    3. آشنایی با Tab مرتبط با Misc در پنجره Properties

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

    برای همین منظور مجدد به پروژه ای که در آموزش هشتم تحت عنوان My First Android Project ایجاد کردیم رجوع می کنیم. پس از باز کردی فایل main.xml که در فولدر layout زیرشاخه res قرار دارد با کد زیر مواجه خواهیم شد:


    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" > </LinearLayout>
    در آموزش گذشته ساختار کلی کد فوق مورد بررسی قرار گرفت. در این آموزش قصد داریم تا تگ مرتبط با را مورد بررسی قرار دهیم. اگر خاطرمان باشد پس از ساخت این پروژه و اجرای آن روی Emulator یا یک دستگاه واقعی عبارت Hello World, MainActivity! روی صفحه دستگاه به نمایش در آمد. در حقیقت چیزی که این عبارت را در خود ذخیره ساخته است همین Tag است که در کد فوق مشاهده می شود. همانطور که می بینیم در تگ layout_width مقدار fill_parent در نظر گرفته شده است که در آموزش پیشین با آن آشنا شدیم. در تگ layout_height می بینیم که مقدار wrap_content در نظر گرفته شده است. معادل های فارسی واژه انگلیسی wrap را می توان "پیچیدن، پوشاندن، بسته بندی کردی، کادو کردن و ..." در نظر گرفت. معادل فارسی واژه انگلیسی content هم "محتوا" یا به عبارتی محتویات داخل چیزی است. به طور کلی می توان گفت که هر زمانیکه ما از مقدار wrap_content استفاده کنیم این دستور را به سیستم می دهیم که چیزی که عرض یا ارتفاع آن دارای این مقدار می باشد بایستی فقط آنقدر یا از عرض و یا از ارتفاع امتداد یابد که محتویات داخلش را نشان دهد. به عبارت دیگر فرض کنیم که متنی داریم که ارتفاع فونت آن معادل با 12 پیکسل است. حال اگر layout_height این متن را معادل با wrap_content قرار دهیم، ارتفاع این متن فقط به اندازه ای خواهد بود که ارتفاع فونت قرار گرفته در این متن را پوشش دهد نه کمتر و نه بیشتر(نکته ای که در مورد مقادیر fill_parent و wrap_content می بایست همواره مد نظر قرار دهیم این است که این دو مقدار هم می توانند برای تگ layout_width و هم برای تگ layout_height مورد استفاده قرار گیرند).

    به طور کلی می توان گفت که هر چیزی که روی یک UI قرار می گیرد به منزله یک view است یعنی چیزی که نمایی دارد مثل یک متن، یک دکمه و غیره. می توان گفت که علاوه بر مقادیر fill_parent و wrap_content می توان از مقادیر عددی هم استفاده کرد. در صورتیکه بخواهیم از مقادیر عددی استفاده کنیم همواره این نکته را می بایست به خاطر داشته باشیم که از چه واحدی استفاده کنیم(برای آشنایی بیشتر با واحدهای اندازه گیری در سیستم عامل اندروید به آموزش شانزدهم مراجعه نمایید). به طور خلاصه واحدی که این تضمین را به ما خواهد داد تا کمترین تفاوت را در صفحه نمایش هایی با Density مختلف داشته باشیم واحد dip است(این واحد به صورت dp هم نوشته می شود. به خاطر داشته باشیم که dip را با dpi اشتباه نگیریم).

    برای روشن شدن این مطلب روی Tab مرتبط با Graphical Layout کلیک کرده و تصویری همچون تصویر زیر مشاهده خواهیم کرد:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود با یک بار کلیک کردن روی TextView یک حاشیه آبی رنگ دور آن قرار می گیرد که نشانگر این مسئله است که این متن انتخاب شده است. ناحیه سیاه رنگی که در تصویر مشخص است نشانگر کل صفحه نمایش است. اگر خاطرمان باشد تگ layout_width را با مقدار fill_parent تعریف کردیم. در حقیقت این صفحه سیاه رنگ به منزله parent یا همان چیزی است که متن را در خود جای داده است. حال از آنجا که مقدار Layout_width معادل با fill_parent است این دستور را می دهیم تا عرض این متن ساختار parent یا همان ساختاری در برگیرنده اش را "پر" سازد(فعل fill در زبان فارسی به معنی "پر کردن" است). از این رو می بینیم که خط آبی کل عرض صفحه سیاه رنگ را پوشش داده است. اکنون اگر ارتفاع این حاشیه آبی رنگ را مد نظر قرار دهیم، خواهیم دید که فقط به اندازه ای امتداد پیدا کرده است که ارتفاع فونت موجود در آن را پوشش دهد نه بیشتر و نه کمتر.

    حال فرض کنیم که می خواهیم ابعاد این TextView را به طور دستی وارد کنیم. برای این منظور مجدد به Tab مربوط به main.xml رفته و آن را به صورت زیر ویرایش می کنیم:


    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="200dip" android:layout_height="48dip" android:text="@string/hello" > <LinearLayout>
    همانطور که در کد فوق ملاحظه می شود مقادیر layout_width و layout_height به ترتیب به 200dip و 48dip تغییر پیدا کرده اند. اکنون مجدد به Tab مربوط به Graphical Layout بازگشته و انتظار می رود که حالتی همچون تصویر زیر را ببینیم:

    [​IMG]
    همانطور که در تصویر فوق در قالب یک کادر قرمز رنگ نشان داده شده است ابعاد عرض و ارتفاع این متن به ترتیب به 200dip و 48dip تغییر یافته اند که این موضوع را می توان از روی تغییر اندازه کادر آبی رنگ به وضوح درک کرد.

    یک راه تغییر ابعدا یک view همین روشی است که در بالا انجام دادیم یعنی ویرایش کردن مستقیم کد اما این در حالی است که اینکار را می توان از طریق پنجره Properties هم انجام داد(چنانچه این پنجره باز نباشد طبق آموزش بیستم می توان آن را باز نمود):

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود پس از باز کردن پنجره Properties در محیط اکلیپس که در تصویر فوق با یک فلش قرمز رنگ مشخص شده است Tab های مختلفی خواهیم دید که یکی از آنها که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است Misc است که مخفف واژه Miscellaneous به معنی "متفرقه و گوناگون" می باشد.

    همانطور که در تصویر فوق ملاحظه می شود مقابل Layout height دقیقا همان مقداری را می بینیم که به طور دستی وارد کردیم و مقابل Layout width هم مقدار 200dip را می بینیم که قبلا وارد کرده بودیم. حال در تصویر فوق با کلیک کردن روی جاهایی که با دو خط قرمز رنگ مشخص شده اند امکان ویرایش آن مقادیر برای ما بوجود خواهد آمد. به طور مثال مقدار Layout height را به fill_parent و مقدار Layout_width را هم به fill_parent تغییر می دهیم:

    [​IMG]
    همانطور که در تصویر فوق مشاهده می شود، پس کلیک کردن به طور مثال روی عدد 200dip خواهیم دید که یک فلش نمایان می شود(در تصویر فوق با یک دایره قرمز رنگ مشخص شده است). پس از کلیک کردن روی آن فلش خواهیم دید که پنجره کوچکی باز خواهد شد که از داخل آن می توانیم مقادیر از پیش تعریف شده fill_parent و wrap_content را انتخاب کنیم. اکنون پس از اینکار خواهیم دید که کادر آبی رنگ به صورت زیر به کلی تغییر اندازه خواهد داد:

    [​IMG]
    همانطور که در تصویر فوق با یک کادر قرمز رنگ مشخص شده است، می بینیم که ابعاد متن ما تغییر اندازه پیدا کرده و از آنجا که مقدار layout_width و layout_height هر دو معادل fill_parent است، می بینیم که کادر آبی رنگ کل فضای سیاه صفحه را در برگرفته است(به خاطر داشته باشیم که ما با اینکار فقط اندازه کادر متن را می توانیم تغییر دهیم و با اینکار به هیچ وجه اندازه فونت متن تغییر پیدا نخواهد کرد. در آموزش های آتی به تفصیل پیرامون نحوه تغییر اندازه فونت صحبت خواهیم کرد).

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. تفاوت مقادیر fill_parent و wrap_content چیست؟
    2. به جای مقادیر fill_parent و wrap_content از چه واحدی می توان استفاده کرد؟
    3. برای تغییر ابعداد یک view در ساخت UI از چند روش می توان استفاده کرد؟
    4. چرا با تغییر ابعداد layout_width و layout_height اندازه فونت متن تغییر پیدا نمی کند؟
    در آموزش آتی با فایل strings.xml که در داخل فولدر values که زیرشاخه فولدر res است آشنا خواهیم شد.
     
  10. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,795
    تشکر شده:
    6,456
    امتیاز دستاورد:
    113
    پاسخ : آموزش برنامه نویسی اندروید

    [​IMG] برنامه نویسی

    [h=1]آموزش برنامه نویسی اندروید- قسمت ۳۰: بررسی فایل strings.xml در پوشه values[/h]
    اهداف آموزشی این قسمت عبارتند از: 1. معرفی فایل strings.xml
    2. نحوه ایجاد یک String جدید و اختصاص آن به یک TextView
    3. نحوه لینک دادن به یک String
    4. نحوه تغییر متن یک TextView بدون نیاز به فایل strings.xml
    5. اصطلاح Hardcoding به چه معنا است؟

    اگر خاطرمان باشد در آموزش قسمت بیست و نهم کلیه بخش های مرتبط با یک TextView را مورد بررسی قرار دادیم به جزء بخشی که مرتبط با متن داخل آن TextView بود. برای همین منظور کد مرتبط با UI پروژه ای که در قسمت هشتم ایجاد کردیم را باز می نماییم:



    • <?xml version="1.0" encoding="utf-8"?>
    • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:orientation="vertical" >
    • <TextView
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:text= [MENTION=93377]str[/MENTION]ing/hello" >
    • <LinearLayout>

    در تگ مربوط به TextView در خط آخر تگ android:text= [MENTION=93377]str[/MENTION]ing/hello" را مشاهده می کنیم. به طور کلی می توان گفت که این خط از کد مسئول نمایش دادن نوشته داخل TextView می باشد. اگر خاطرمان باشد نوشته داخل این TextView معادل با Hello World, MainActivity! می باشد اما این در حالی است که در این تگ چیزی به جزء hello نمی بینیم. به منظور روشن شدن این مسئله به پنجره Package Explorer باز می گردیم:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود زیرشاخه این پروژه تحت عنوان My First Android Project فولدری تحت عنوان res وجود دارد. پس از باز کردن فولدر res فولدری تحت عنوان values وجود دارد که در تصویر فوق با یک فلش قرمز رنگ مشخص شده است. پس از باز کردن این فولدر همانطور که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است فایلی تحت عنوان strings.xml وجود دارد. به طور کلی می توان گفت که این فایل مسئول ذخیره سازی متون در یک اپلیکیشن می باشد. برای درک بهتر ماهیت این فایل با دو بار کلیک کردن روی آن در محیط اصلی اکلیپس باز خواهد شد:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود فلش قرمز زنگ نشان دهنده گزینه ای تحت عنوان hello است و این hello همان hello یی است که در TextView به آن اشاره کردیم. در صورتیکه یک بار روی گزینه hello کلیک کنیم خواهیم دید که به رنگ آبی در خواهد آمد سپس اگر به کادر قرمز رنگ توجه کنیم می بینیم که در بخش Name به معنی "نام" واژه hello نوشته شده و در بخش Value به معنی "مقدار" Hello World, MainAvtivity! نوشته شده است.

    [h=3]نحوه ایجاد یک String جدید و اختصاص آن به یک TextView[/h] در این پنجره دکمه ای تحت عنوان Add به معنی "اضافه کردن" وجود دارد که می توانیم از آن برای ایجاد متون جدید استفاده کنیم. برای روشن شدن این مسئله به ذکر مثالی اکتفا می کنیم. فرض کنیم که می خواهیم به جای Hello World, MainActivity! می خواهیم نام خود را روی صفحه نمایش دهیم. برای این منظور روی دکمه Add کلیک کرده و پنجره ای به شکل زیر خواهیم دید:

    [​IMG]
    همانطور که در تصویر فوق با یک بیضی قرمز رنگ مشخص شده است، روی گزینه String دو بار کلیک می کنیم و یا پس از انتخاب آن روی دکمه OK کلیک می کنیم(در حقیقت از آنجا که می خواهیم یک متن جدید ایجاد کنیم می بایست از گزینه String استفاده کنیم. به طور مثال برای تعریف یک رنگ جدید می توان از گزینه Color استفاده کرد. موارد دیگر در آموزش های آتی بسته به نیاز پروژه ها مورد بررسی قرار خواهند گرفت):

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود پس از کلیک کردن روی دکمه OK به پنجره قبل بازگشته با این تفاوت که گزینه دیگری همانطور که با یک بیضی قرمز رنگ مشخص شده است تحت عنوان String به لیست اضافه شده است. در بخشی که با یک کادر قرمز رنگ مشخص شده است در بخش Name نامی را برای این String در نظر می گیریم. به طور مثال بنده نام developer به معنی "توسعه دهنده" را تایپ می کنم(توجه داشته باشید که حرف اول این نام با حرف کوچک تایپ شده است).

    سپس در بخش Value عبارت I am Behzad Moradi به معنی "من بهزاد مرادی هستم" را تایپ می کنم(فراگیران می توانند نام خود و یا هر چیزی دیگری را تایپ کنند). نکته ای که در اینجا حائز اهمیت است این است که برخلاف بخش Name که در آن می بایست اصول خاصی را برای نامگذاری استفاده کرد و مثلا به هیچ وجه از فاصله استفاده نکرد، در بخش Value هر چیزی را می توانیم وارد کنیم تا جاییکه حتی می توان نام خود را به فارسی بنویسیم:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود مقادیر مرتبط با Name و Value وارد شده اند و به محض اینکه فایل خود را از طریق فشردن هم زمان دکمه های Ctrl و S و یا از طریق منوی اصلی گزینه File سپس گزینه Save ذخیره سازیم، خواهیم دید که گزینه جدید که با فلش قرمز رنگ در تصویر قبل تحت عنوان String به لیست اضافه شده بود بلافاصله به نامی که در بخش Name وارد کرده ایم یا در این مثال همان واژه developer تغییر نام می دهد.

    در همین مرحله ادامه آموزش در مورد پنجره بالا را متوقف می کنیم چرا که می خواهیم در اولین برنامه اندروید خود نام خود را به نمایش در آوریم. برای این منظور به فایل main.xml رفته و آنرا به صورت زیر ویرایش می کنیم:



    • <?xml version="1.0" encoding="utf-8"?>
    • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:orientation="vertical" >
    • <TextView
    • android:layout_width="fill_parent"
    • android:layout_height="fill_parent"
    • android:text= [MENTION=93377]str[/MENTION]ing/developer" >
    • <LinearLayout>

    همانطور که در کد فوق ملاحظه می شود در تگ مربوط به text به جای واژه hello واژه جدیدی که تحت عنوان developer ساختیم را می نویسیم و پس از Save کردن همانطور که قبلا آموزش داده شد اپلیکیشن خود را از طریق Emulator اجرا می کنیم:

    [​IMG]
    همانطور که در تصویر فوق که از Emulator گرفته شده است مشاهده می شود عبارت قبلی با عبارتی که برای String جدید خود تحت عنوان developer در نظر گرفتیم یا همان جمله I am Behzad Moradi نمایش داده می شود.

    اکنون مجدد به فایل strings.xml باز می گردیم:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود در پایین این پنجره یک Tab تحت عنوان Resources به معنی "منابع" و یک Tab دیگر تحت عنوان strings.xml وجود دارد. پیش از آنکه روی Tab مربوط به strings.xml کلیک کنیم توجه مان را به String دیگر تحت عنوان app_name که در لیست دیده می شود جلب می کنیم که در ادامه آموزش به معرفی آن خواهیم پرداخت:

    [​IMG]
    به طور کلی می توان گفت که Tab مربوط به strings.xml همان Tab مربوط به Resources است با این تفاوت که به صورت کد نمایش داده می شود. دقیقاً همان سه String یی که در پنجره قبل وجود داشتند با همان نام در این پنجره به شکل کد نمایش داده شده اند.

    همانطور که در کد فوق مشاهده می شود مابین دو تگ و جملاتی به رنگ روشن نوشته شده اند که این جملات دقیقاً همان جملاتی هستند که از طریق نام یک String انتقال داده شده و به نمایش در می آید. پیش از این، در مورد String یی تحت عنوان app_name صحبت کردیم که متن مرتبط با آن My First Android Project می باشد. این String زمانیکه در حین ساخت یک پروژه جدید اقدام به انتخاب نامی برای اپلیکیشن خود می نماییم ایجاد شده و نام مد نظر ما را در خود جای می دهد. اما اکنون ببینیم که این String در کجای اپلیکیشن مورد استفاده قرار می گیرد:



    • <?xml version="1.0" encoding="utf-8"?>
    • <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    • package="com.behzadmoradi.mainpackage"
    • android:versionCode="1"
    • android:versionName="1.0" >
    • <uses-sdk android:minSdkVersion="7" >
    • <application
    • android:icon="@drawable/ic_launcher"
    • android:label= [MENTION=93377]str[/MENTION]ing/app_name" >
    • <activity
    • android:name=".MainActivity"
    • android:label= [MENTION=93377]str[/MENTION]ing/app_name" >
    • <intent-filter>
    • <action android:name="android.intent.action.MAIN" >
    • <category android:name="android.intent.category.LAUNCHER" >
    • <intent-filter>
    • <activity>
    • <application>
    • <manifest>

    پس از باز کردن فایل AndroidManifest.xml کدی به صورت فوق ملاحظه خواهیم کرد. در تنها تگ مربوط به activity این فایل تگی تحت عنوان android:label وجود دارد که مقدار اختصاص داده شده به آن همین app_name است.

    [h=3]نحوه لینک دادن به یک String[/h] اگر به نحوه لینک دادن String های ایجاد شده مثلاً همین String مرتبط با app_name در کد فوق توجه کرده باشیم، خواهیم دید که اول می بایست یک علامت @ قرار داده سپس کلید واژه string را نوشته و در نهایت پس از قرار دادن یک علامت / نام String مد نظر را می نویسیم که به طور کامل به صورت زیر خواهد بود:



    • android:label= [MENTION=93377]str[/MENTION]ing/app_name"

    [h=3]نحوه تغییر متن یک TextView بدون نیاز به فایل strings.xml[/h] به طور کلی می توان گفت که دلیل اصلی استفاده از فایل strings.xml برای ذخیره سازی متون در یک اپلیکیشن، امکان برخورداری از قابلیت تغییر زبان است. به عبارت دیگر ما می توانیم چندین فولدر values برای زبان های مختلف در نظر بگیریم و محتویات فایل strings.xml داخل آنها را بسته به نوع زبان مدنظر ویرایش کنیم تا هر زمان که کاربر زبان دستگاه خود را تغییر داد، اپلیکیشن به صورت خودکار از منابع مرتبط با آن زبان انتخاب کند. حال چنانچه نخواهیم از این قابلیت اندروید استفاده کنیم، می توان به سادگی فایل strings.xml را نادیده گرفته و متن خود را به صورت زیر وارد کرد:

    [​IMG]
    همانطور که در تصویر فوق ملاحظه می شود، کد [MENTION=93377]str[/MENTION]ing/ را که به اندروید دستور می دهد تا به فایل strings.xml رجوع کند را حذف کرده ایم و مستقیماً عبارت This is a new text! به معنی "این یک متن جدید است!" را وارد می کنیم. حال به محض اینکه فایل خود را Save کنیم همانطور که در تصویر فوق ملاحظه می شود یک علامت اخطار زرد رنگ نمایان خواهد شد. چنانچه نشانگر موس خود را روی آن قرار دهیم، عبارت Hardcoded “This is a new text!”, should use [MENTION=93377]str[/MENTION]ing resource به معنی " عبارت “This is a new text!” به صورت Hardcoding وارد شده است، شما بایستی از فایل strings استفاده کنید" نشان داده خواهد شد(در ادامه با اصطلاح Hardcoding بیشتر آشنا خواهید شد).

    در حقیقت می توان گفت که این نشانگر زرد رنگ یک Warning یا "هشدار" است و به هیچ وجه یک Error یا "خطا" نمی باشد. این هشدار به ما اطلاع می دهد که می بایست متن خود را داخل فایل strings بنویسیم تا چنانچه خواستیم اپلیکیشن خود را برای زبان های مختلف طراحی کنیم با مشکل مواجه نشویم. به سادگی می توان هشدارهایی از این دست را نادیده بگیریم.

    [h=3]آشنایی با اصطلاح Hardcoding[/h] به طور خلاصه در برنامه نویسی زمانیکه اطلاعات در خود Source Code یا همان کد برنامه وارد شوند و این اطلاعات از منابع خارجی مثل strings.xml وارد کد نشوند ما Hardcoding انجام داده ایم. به عبارت دیگر با Hardcoding امکان ویرایش اطلاعات به طور مستقیم از بین خواهد رفت و این مسئله Flexibility یا "انعطاف پذیری" برنامه را کاهش خواهد داد.

    پس از مطالعه این آموزش انتظار می رود بتوانیم به سؤالات زیر پاسخ بدهیم:
    1. نحوه ساخت یک String جدید به چه شکل است؟
    2. چگونه می توان به یک String در بخش های مختلف یک اپلیکیشن لینک داد؟
    3. علاوه بر فایل strings.xml چه راه کار دیگری برای وارد کردن متن به یک اپلیکیشن وجود دارد؟
    4. منظور از Hardcoding چیست؟
    در آموزش آتی با روش دیگری جهت حذف، اضافه و یا ویرایش یک متن در فایل strings.xml همچنین اصول نامگذاری String ها در اندروید خواهیم پرداخت.