ساختن و استفاده از منابع (Resources)
تماشای برخط [لینک مستقیم] فیلم آموزشی «نحوه ی ساخت و استفاده از منابع»
زیر نویس انگلیسی [English Subtitle]
دریافت نسخه pdf این آموزش [1.73 مگابایت]
وقتی دارید برنامتون رو میسازید احتمال زیاد از منابع بیرونی هم استفاده خواهید کرد، مثل فایلهای ویدیویی یا شنیداری، تصاویر، xml و ... پس باید بدونید چطور از داخل برنامتون به این منابع ارجاع بدید. منابع برنامتون داخل پوشه ی res ذخیره می شن. و یه سری فایلها به صورت خودکار بهش اضافه می شه مثل :
layout : شامل فایل های xml ای که مربوط به محیط های کاربریه.
values : شامل تمام مقادیریه که توی برنامتون تعریف می کنید و بهشون یه اسم می دید و بعدا با اون اسم بهشون رجوع می کنید و ازشون استفاده می کنید.
فایل string.xml هم به طور پیش فرض در این فولدر به وجود اومده. نحوهی کارکرد string.xml این طوریه که ما یه سری منابع رشتهای داریم که مثلا (با توجه به تصویر) هرجا که تو برناممون بخوایم از Hello World, Main! استفاده کنیم، به جاش می تونیم به این منبع ارجاعش بدیم و بنویسیم hello.
حالا چرا این منابع رو بیرون نگه میداریم؟ به خاطر اینکه بتونیم متغیرهای سراسری (global) داشته باشیم، مثلا می تونیم چند تا فولدر برای زبان های مختلف داشته باشیم و فقط لازمه که به فایل xml مربوط به اون زبان بریم و دیگه لازم نیست تمام کدهای برناممون رو به خاطر تغییر زبان کاربر تغییر بدیم.
۲.اگه به سایت اصلی توسعه اندروید مراجعه کنید یه قسمت داره به اسم API Guide که توش راهنمایی های مفیدی برای ساخت برنامه کرده، یکی از این راهنماها مربوط به منابع می شه، خود اندروید به طور پیش فرض یه سری از فولدرها رو تو res تشخیص میده مثلا
اگه فولدر anim رو درست کنید و توش یه فایل xml مخصوص انیمیشن بذارید، اندروید متوجه می شه که انیمیشنه. (تو آموزش های بعدی مفصل به انیمیشن می پردازیم).
یا مثلا اگه میخواید یه لیستی از رنگ ها رو در برنامتون استفاده کنید می تونید تو فولدر color بذاریدشون.
هر کدوم از عکسهامون یا هر فایل xml مربوط به گرافیک در داحل فولدر drawable قرار می گیره.
فولدر layout شامل فایلهای xml مربوط به چیدمان صفحه است.
اگه بخوایم منو برای برناممون بسازیم (که بعدا آموزش داده خواهد شد) باید اونو تو فولدر menu بذاریم و ...
چون تمام این منابع نوعی assets هستن، ممکنه از خودتون بپرسید پس این فولدر assets چیه (معمولا بالای فولدره bin هست)، در واقع می تونید منابعتون رو تو این فولدر بذارید ولی نمی تونید با یک id بهشون ارجاع بدید. به همین خاطر بهتره تمام منابع رو توی همون فولدر res قرار بدیم چون به طور خودکار براشون id ساخته می شه و با دستور R.id می تونید بهشون رجوع کنید.
۳.اگه تو زیر شاخه های فولدر res دقت کرده باشید، خود فولدر drawable به تنهایی وجود نداره بلکه سه تا فولدر drawable-hdpi، drawable-ldpi و drawable-mdpi وجود دارن، این به خاطر یک ویژگی مهمه اندرویده که دستگاه ها رو به سه وضوح تصویر تقسیم بندی کرده : دستگاههای با وضوح تصویر بالا (High dpi)، دستگاههای با وضوح تصویر متوسط (Medium dpi) و دستگاههای با وضوح تصویر پایین (Low dpi). برای هر کدوم از این وضوح تصویرهای مختلف میتونیم assetهای مربوط به خودشون رو بذاریم، و سیستم اندروید با توجه به دستگاهی که داره روش اجرا میشه، asset مربوطه رو بیرون میکشه و در برنامه ازش استفاده می کنه (توی یه آموزش دیگه بهش میپردازیم) ولی فقط بدونید که اگر از یه asset خواستید که تو همهی وضوح تصاویر استفاده بشه، کافیه فقط توی drawable-hdpi بذاریدش، اون وقت تو یه دستگاه با وضوح تصویر متوسط یا پایین هم سیستم از تو فولدر drawable-hdpi برشون میداره.
۴.راحتترین راه برای اضافه کردن asset به برنامهتون اینه که محتوایی که می خواید رو بکشید و تو فولدر مورد نظر ول کنید.
برای این که به پیغام خطا برخورد نکنید حواستون باشه اسم asset هایی که میخواید وارد کنید فقط میتونه شامل حروف a تا z، اعداد 0 تا 9 و خط زیر باشه.
۵.تو فولدر gen اگه R.java رو باز کنید، میبینید که به اون asset جدیدی که اضافه کردید یه عدد نسبت داده، لازم نیست برای ارجاع به این asset اون عدد رو استفاده کنید بلکه از راه دیگه ای این کارو میکنیم که الان توضیح میدم. (حواستون باشه که اصلا تغییری هم توی فایل R.java ایجاد نکنید چون این فایل به طور خودکار درست میشه و اگه تغییرش بدید برنامتون به هم میریزه.)
۶.من برای این آموزش یه پروژهی جدید ساختم و تا اینجا فقط یه عکس به فولدر drawable-hdpi اضافه کردم، از فولدر res به layout برید و فایل xml اصلی تون رو انتخاب کنید (برای من main.xml هست)، اون فیلد متنی رو پاک کنید، به جاش میخوایم عکسی که به پروژه اضافه کردیم رو بذاریم، از منوی کنار Images & Media رو انتخاب کنید و اون المانی که تو عکس دورش قرمز شده رو انتخاب کنید و به داخل صفحه بکشید و ول کنید، حالا ازتون میخواد منبع عکس رو مشخص کنید.
برای اینکه متوجه بشید دقیقا چه اتفاقی افتاده، به قسمت ویرایش متنی xml برید، تو مشخصات این تصویر یه قسمت داره به اسم android:src
که با کد @drawable/androidcode_logo
به تصویر مورد نظر ارجاع داده.
اصولا برای ارجاع به هر چیزی از علامت @ استفاده میکنیم.مثلا اینجا بعد از علامت @ می خوایم به drawable بریم.
و بعد هم یه تصویر دیگه رو انتخاب میکنیم، مثل ic_launcher.
دقت کنید که برای رسیدن به androidcode_logo یا هر asset دیگهای، نیازی نبود که بنویسیم @drawable-hdpi
فقط کافی بود از @drawable
استفاده کنیم. اینکه این asset از کدوم وضوح تصویر انتخاب بشه رو، خود سیستم عامل اندروید با توجه گوشی کاربر انجام میده. حالا اگه به قسمت گرافیکی main.xml بریم، میبینیم که تصویر عوض شده.
خوب این روش ارجاع در فایل های xml بود، حالا اگه از فایلهای جاوا بخوایم به منابعمون ارجاع بدیم باید چی کار کنیم؟
۷.اول یه ارجاع از خود ImageView میگیریم :
ImageView ax = (ImageView) findViewById (R.id.imageView1);
بعد منبع این ImageView رو میذاریم عکسی که میخوایم :
ax.setImageResource(R.drawable.androidcode_logo);
این دستور باعث میشه وقتی که برنامه اجرا شد، منبع عکس از اون چیزی که بوده، تغییر پیدا کنه به R.drawable.androidcode_logo
و وقتی برنامه رو اجرا میکنیم، این خروجی رو میبینیم.
فایل main.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </LinearLayout>
فایل Main.java :
package ir.AndroidCode.intent; import android.app.Activity; import android.os.Bundle; import android.widget.ImageView; public class Main extends Activity { @Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView ax = (ImageView) findViewById (R.id.imageView1); ax.setImageResource(R.drawable.androidcode_logo); } }
دعات قطعا می گیره واسه ماهم دعا کن