سازماندهی و دسترسی به منابع اندروید

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

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

سازماندهی منابع در اندروید استودیو

شما باید هر نوع منبع را در یک دایرکتوری فرعی خاص از دایرکتوری res/ پروژه­ی خود قرار دهید. برای مثال، در اینجا یک سلسله مراتبِ فایل برای یک پروژه ساده ارائه شده است.

MyProject/
   app/
      manifest/
         AndroidManifest.xml
   java/
      MyActivity.java  
      res/
         drawable/  
            icon.png  
         layout/  
            activity_main.xml
            info.xml
         values/  
            strings.xml

 

دایرکتوری res/ شامل همه ­ی منابع موجود در دایرکتوری های فرعی مختلف است. در اینجا ما یک فایل منبع تصویر، دو فایل منبع صفحه بندی و یک فایل منبع رشته داریم. جدول زیر جزئیاتی را در مورد دایرکتوری های منابع پشتیبانی شده در دایرکتوری res/ پروژه ارائه می دهد.

دایرکتوری
نوع منبع
anim/
فایل های XML ای که ویژگی های انیمیشن ها را تعریف می کنند. آنها در پوشه­ی res/anim/ ذخیره می شوند و به وسیله­ی کلاس R.anim مورد دسترسی قرار می گیرند.
color/
فایل های XML ای که لیست وضعیت رنگ ها را تعریف می کند. آنها در پوشه res/color/ ذخیره میشوند و از طریق کلاس R.color مورد دسترسی قرار می گیرند.
drawable/
فایل های تصویری مانند .png،.gif،.jpg یا فایل های XML ای هستند که به بیت مپ ها، لیست های وضعیت (state list)، شکل ها(shapes) و موارد کشیدنی انیمیشن ها (animation drawables) کامپایل می شوند. آنها در پوشه res/drawable/ ذخیره میشوند و از کلاس R.drawable مورد دسترسی قرار می گیرند.
layout/
فایل های XML ای که یک طرح واسط کاربری را تعریف می کنند. آنها در پوشه res/layout/ ذخیره می شوند و از طریق کلاس R.layout مورد دسترسی قرار می گیرند.
menu/
فایل های XML ای که منوهای اپلیکیشن ها را تعریف می کنند. مانند منوی گزینه ها (Options Menu)، Context Menu یا Sub Menu (منوی فرعی). آنها در پوشه res/menu/ ذخیره میشوند و از طریق کلاس R.menu مورد دسترسی قرار می گیرند.
raw/
فایل های اختیاری ای که به شکل خام خود ذخیره میشوند. شما باید Resources.openRawResource() را با شناسه منبع (resource ID) فراخوانی کنید که به صورت R.raw.filename برای باز کردن این فایل های خام است.
values/
فایل های XML ای که شامل مقادیر ساده مانند رشته ها، اعداد صحیح و رنگ ها هستند.برای مثال، در اینجا برخی از قرارداد های نام فایل برای منابعی که شما می توانید در این دایرکتوری ایجاد کنید ارائه شده است:
arrays.xml مربوط به منابع آرایه ای(resource arrays) است و دسترسی به آنها از طریق کلاس R.array انجام می شود.
integers.xml مربوط به منابع اعداد صحیح (resource integers) است و دسترسی به آنها از طریق کلاس R.integer انجام می شود.
bools.xml مربوط به منابع بولی است و دسترسی به آنها از طریق کلاس R.bool انجام می شود.
colors.xml مربوط به مقادیر رنگ است و دسترسی به آن از طریق کلاس R. color انجام می شود.
dimens.xml مربوط به ابعاد است و دسترسی به آن از طریق کلاس R. dimen انجام می شود.
strings.xml مربوط به مقادیر رشته است و دسترسی به آن از طریق کلاس R. string انجام می شود.
styles.xml مربوط به استایل ها (Style) است و دسترسی به آن از طریق کلاس R. style انجام می شود
xml/
فایل های XML اختیاری ای که می توانند در زمان اجرا با فراخوانی Resources.getXML() خوانده شوند. شما می توانید فایل های پیکره بندی مختلف را برای استفاده در زمان اجرا، در اینجا ذخیره کنید.

منابع جایگزین

اپلیکیشن شما باید منابع جایگزینی را برای پشتیبانی از تنظیمات خاص دستگاه فراهم کند. برای مثال، شما باید منابع کشیدنی جایگزین (یعنی تصاویر) را برای وضوح تصویرهای مختلف (رزولوشن های تصویر مختلف) و منابع رشته ای جایگزین را برای زبان های مختلف در نظر بگیرید. در زمان اجرا، اندروید تنظیمات فعلی دستگاه را تشخیص می دهد و منابع مناسب را برای اپلیکیشن شما بارگذاری می کند.

برای تعیین جایگزین هایی با تنظیمات خاص برای مجموعه ای از منابع، مراحل زیر را دنبال کنید.

یک دایرکتوری جدید در res/ named  ایجاد کنید. در اینجا resources_name می تواند هر کدام از منابع مطرح شده در جدول بالا مانند layout، drawable و غیره باشد. qualifier (توصیف کننده) یک پیکر بندی منحصر به فرد را مشخص می کند که این منابع در آن استفاده می شوند. شما می توانید اسناد رسمی را برای لیست کاملی از توصیف گرهای مربوط به انواع مختلف منابع، بررسی کنید.

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

در ادامه مثالی آمده است که تصاویر را برای یک صفحه نمایش پیش فرض و تصاویر جایگزین را برای صفحاتی با رزولوشن بالا تعیین می کند.

MyProject/
   app/
      manifest/
         AndroidManifest.xml
   java/
      MyActivity.java   
      res/
         drawable/  
            icon.png
            background.png
         drawable-hdpi/  
            icon.png
            background.png  
         layout/  
            activity_main.xml
            info.xml
         values/  
            strings.xml

 

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

MyProject/
   app/
      manifest/
         AndroidManifest.xml
   java/
      MyActivity.java   
      res/
         drawable/  
            icon.png
            background.png
         drawable-hdpi/  
            icon.png
            background.png  
         layout/  
            activity_main.xml
            info.xml
         layout-ar/
            main.xml
         values/  
            strings.xml

مثال:

برای دسترسی به res/drawable/myimage.png و تنظیم یک ImageView شما از کد زیر استفاده می کنید.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string  name="hello">Hello, World!</string>
</resources>

 

اکنون شما می توانید، متن را بر روی یک شی TextView با شناسه ­ی msgID msg، با استفاده از یک شناسه منبع به صورت زیر تنظیم کنید.

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

 

 مثال:

یک صفحه بندی res/layout/activity_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:id="@+id/text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a TextView" />

   <Button android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a Button" />
      
</LinearLayout>

 

این کد اپلیکیشن، این صفحه بندی را برای یک فعالیت، در متد () onCreate به صورت زیر بارگذاری می کند.

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
}

 

دسترسی به منابع در XML

فایل منبع XML، res/values/strings.xml که شامل یک منبع رنگ و یک منبع رشته است.

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

 

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

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:textColor="@color/opaque_red"
   android:text="@string/hello" />

 

اکنون اگر شما بار دیگر به فصل قبل برگردید که من مثال Hello World! را شرح دادم، مطمئن هستم که شما درک بهتری از تمام مفاهیم شرح داده شده در این فصل خواهید داشت. بنابراین، من به شدت توصیه می کنم که فصل قبل را به عنوان مثال عملی بررسی کنید و ببینید که چگونه از منابع مختلف در سطح بسیار ابتدایی استفاده شده است.