منابع، فایلهای اضافی و محتوای استاتیکی هستند که کد شما از آنها استفاده میکند، مانند بیتمپها، رشتههای رابط کاربری، دستورالعملهای انیمیشن و موارد دیگر.
همیشه منابع برنامه مانند تصاویر و رشتهها را از کد خود خارجی کنید تا بتوانید آنها را به طور مستقل نگهداری کنید. همچنین، با گروهبندی آنها در دایرکتوریهای منابع با نامهای خاص، منابع جایگزین برای پیکربندیهای خاص دستگاه فراهم کنید. در زمان اجرا، اندروید بر اساس پیکربندی فعلی از منبع مناسب استفاده میکند. به عنوان مثال، ممکن است بخواهید بسته به تنظیمات زبان، رشتههای متفاوتی ارائه دهید.
پس از اینکه منابع برنامه خود را خارجیسازی کردید، میتوانید با استفاده از شناسههای منبع که در کلاس R پروژه شما تولید میشوند، به آنها دسترسی داشته باشید. این سند به شما نشان میدهد که چگونه منابع را در پروژه اندروید خود گروهبندی کنید. همچنین به شما نشان میدهد که چگونه منابع جایگزین را برای پیکربندیهای خاص دستگاه فراهم کنید و سپس از کد برنامه یا سایر فایلهای XML خود به آنها دسترسی پیدا کنید.
انواع منابع گروهی
هر نوع منبع را در یک زیرشاخه خاص از دایرکتوری res/ پروژه خود قرار دهید. برای مثال، در اینجا سلسله مراتب فایل برای یک پروژه ساده آمده است:
MyProject/
src/
MyActivity.kt
res/
drawable/
graphic.png
mipmap/
icon.png
values/
strings.xml
دایرکتوری res/ شامل تمام منابع موجود در زیرشاخههای خود است: یک منبع تصویر، یک دایرکتوری mipmap/ برای آیکونهای لانچر و یک فایل منبع رشتهای. نام دایرکتوریهای منابع مهم هستند و در جدول ۱ توضیح داده شدهاند.
نکته: برای اطلاعات بیشتر در مورد استفاده از پوشههای mipmap، به بخش «قرار دادن آیکونهای برنامه در دایرکتوریهای mipmap» مراجعه کنید.
جدول ۱. دایرکتوریهای منابع پشتیبانیشده در دایرکتوری res/ پروژه.
| دایرکتوری | نوع منبع |
|---|---|
drawable/ | فایلهای بیتمپ (PNG،
برای اطلاعات بیشتر، به منابع Drawable مراجعه کنید. |
mipmap/ | فایلهای قابل ترسیم برای تراکمهای مختلف آیکونهای لانچر. برای اطلاعات بیشتر در مورد مدیریت آیکونهای لانچر با پوشههای mipmap/ ، به بخش «قرار دادن آیکونهای برنامه در دایرکتوریهای mipmap» مراجعه کنید. |
raw/ | فایلهای دلخواه برای ذخیره به شکل خام خود. برای باز کردن این منابع با با این حال، اگر به دسترسی به نام اصلی فایلها و سلسله مراتب فایلها نیاز دارید، ذخیره منابع در دایرکتوری |
values/ | فایلهای XML که حاوی مقادیر سادهای مانند رشتهها، اعداد صحیح و رنگها هستند. در حالی که فایلهای منبع XML در سایر زیرشاخههای از آنجا که هر منبع با عنصر XML مخصوص به خود تعریف میشود، میتوانید نام فایل را هر چه میخواهید بگذارید و انواع مختلف منابع را در یک فایل قرار دهید. با این حال، برای وضوح بیشتر، ممکن است بخواهید انواع منابع منحصر به فرد را در فایلهای مختلف قرار دهید. برای مثال، در اینجا برخی از قراردادهای نام فایل برای منابعی که میتوانید در این دایرکتوری ایجاد کنید، آورده شده است:
برای اطلاعات بیشتر، به منابع رشتهای ، منابع سبک و انواع منابع بیشتر مراجعه کنید. |
xml/ | فایلهای XML دلخواه که میتوانند در زمان اجرا با فراخوانی Resources.getXML خوانده شوند. فایلهای پیکربندی XML مختلف باید در اینجا ذخیره شوند. |
font/ | فایلهای فونت با پسوندهایی مانند TTF، OTF یا TTC، یا فایلهای XML که شامل عنصر <font-family> هستند. برای اطلاعات بیشتر در مورد فونتها به عنوان منابع، به بخش افزودن فونت به عنوان منبع XML مراجعه کنید. |
هشدار: هرگز فایلهای منبع را مستقیماً درون پوشه res/ ذخیره نکنید. این کار باعث خطای کامپایلر میشود.
منابعی که در زیرشاخههای تعریفشده در جدول ۱ ذخیره میکنید، منابع پیشفرض شما هستند. یعنی این منابع، طراحی و محتوای پیشفرض برنامه شما را تعریف میکنند. با این حال، انواع مختلف دستگاههای اندروید ممکن است به انواع مختلفی از منابع نیاز داشته باشند.
برای مثال، میتوانید منابع رشتهای مختلفی ارائه دهید که متن موجود در رابط کاربری شما را بر اساس تنظیمات زبان دستگاه ترجمه میکنند.
نکته: در Compose، رابطهای کاربری، انیمیشنها و رنگهای وابسته به حالت در کاتلین تعریف میشوند، بنابراین دایرکتوریهای layout/ ، menu/ ، anim/ ، animator/ و color/ برای برنامههای مدرن منسوخ شدهاند. برای اطلاعات بیشتر، به Animations در Compose و Anatomy of a theme در Compose مراجعه کنید.
منابع جایگزین ارائه دهید
اکثر برنامهها منابع جایگزینی را برای پشتیبانی از پیکربندیهای خاص دستگاه ارائه میدهند. به عنوان مثال، منابع ترسیمی جایگزین را برای تراکمهای مختلف صفحه نمایش و منابع رشتهای جایگزین را برای زبانهای مختلف در نظر بگیرید. در زمان اجرا، اندروید پیکربندی فعلی دستگاه را تشخیص داده و منابع مناسب را برای برنامه شما بارگذاری میکند.
برای مشخص کردن گزینههای خاص پیکربندی برای مجموعهای از منابع، موارد زیر را انجام دهید:
- یک دایرکتوری جدید در
res/ایجاد کنید که به شکل<resources_name> - <qualifier>نامگذاری شده باشد.-
<resources_name>نام دایرکتوری منابع پیشفرض مربوطه است (تعریف شده در جدول ۱). -
<qualifier>نامی است که پیکربندی منحصر به فردی را که این منابع برای آن استفاده میشوند، مشخص میکند (تعریف شده در جدول 2).
میتوانید بیش از یک
<qualifier>اضافه کنید. هر کدام را با یک خط تیره از هم جدا کنید.احتیاط: هنگام افزودن چندین توصیفکننده، باید آنها را به همان ترتیبی که در جدول ۲ فهرست شدهاند، قرار دهید. اگر توصیفکنندهها به طور نادرست مرتب شده باشند، منابع نادیده گرفته میشوند.
-
- منابع جایگزین مناسب را در این دایرکتوری جدید ذخیره کنید. فایلهای منبع باید دقیقاً مشابه فایلهای منبع پیشفرض نامگذاری شوند.
برای مثال، در اینجا برخی از منابع پیشفرض و جایگزین آورده شده است:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
توصیفکننده hdpi نشان میدهد که منابع موجود در آن دایرکتوری برای دستگاههایی با صفحه نمایش با تراکم بالا هستند. تصاویر موجود در این دایرکتوریهای drawable برای تراکمهای صفحه نمایش خاص اندازهگذاری شدهاند، اما نام فایلها دقیقاً یکسان هستند. به این ترتیب، شناسه منبعی که برای ارجاع به تصویر icon.png یا background.png استفاده میکنید، همیشه یکسان است. اندروید با مقایسه اطلاعات پیکربندی دستگاه با توصیفکنندههای موجود در نام دایرکتوری منابع، نسخهای از هر منبع را که به بهترین وجه با دستگاه فعلی مطابقت دارد، انتخاب میکند.
احتیاط: هنگام تعریف یک منبع جایگزین، مطمئن شوید که آن منبع را در پیکربندی پیشفرض نیز تعریف کردهاید. در غیر این صورت، برنامه شما ممکن است هنگام تغییر پیکربندی توسط دستگاه با استثنائات زمان اجرا مواجه شود. به عنوان مثال، اگر یک رشته فقط به values-en و نه values اضافه کنید، برنامه شما ممکن است هنگام تغییر زبان پیشفرض سیستم توسط کاربر با استثنای Resource Not Found مواجه شود.
جدول ۲ توصیفکنندههای پیکربندی را به ترتیب اولویت فهرست میکند. میتوانید با جدا کردن هر توصیفکننده با خط تیره، چندین توصیفکننده را به نام یک دایرکتوری اضافه کنید. اگر از چندین توصیفکننده برای یک دایرکتوری منابع استفاده میکنید، باید آنها را به ترتیبی که در جدول فهرست شدهاند، به نام دایرکتوری اضافه کنید.
جدول ۲. نامهای توصیفکننده پیکربندی.
| پیکربندی | مقادیر واجد شرایط | توضیحات |
|---|---|---|
| MCC و MNC | مثالها:mcc310mcc208-mnc00 | کد کشور تلفن همراه (MCC)، که به صورت اختیاری با کد شبکه تلفن همراه (MNC) از سیم کارت موجود در دستگاه دنبال میشود. به عنوان مثال، اگر دستگاه از اتصال رادیویی استفاده میکند (یعنی یک تلفن GSM است)، مقادیر MCC و MNC از سیم کارت میآیند. همچنین میتوانید به تنهایی از MCC استفاده کنید، برای مثال، برای گنجاندن منابع حقوقی خاص کشور در برنامه خود. اگر نیاز دارید که فقط بر اساس زبان مشخص کنید، به جای آن از توصیفکننده زبان، خط (اختیاری) و منطقه (اختیاری) استفاده کنید. اگر از توصیفکننده MCC و MNC استفاده میکنید، این کار را با دقت انجام دهید و آزمایش کنید که مطابق انتظار کار کند. همچنین به فیلدهای پیکربندی |
| زبان، خط (اختیاری) و منطقه (اختیاری) | مثالها:enfren-rUSfr-rFRfr-rCAb+enb+en+USb+es+419b+zh+Hantb+sr+Latn+RS | این زبان با یک کد زبان دو حرفی ISO 639-1 تعریف میشود که به صورت اختیاری با یک کد منطقه دو حرفی ISO 3166-1-alpha-2 (که قبل از آن کدها به حروف کوچک و بزرگ حساس نیستند . پیشوند اندروید ۷.۰ (سطح API ۲۴) پشتیبانی از برچسبهای زبانی BCP 47 را معرفی کرد که میتوانید از آنها برای تعیین صلاحیت منابع خاص زبان و منطقه استفاده کنید. یک برچسب زبانی از دنبالهای از یک یا چند زیربرچسب تشکیل شده است که هر کدام از آنها دامنه زبان شناسایی شده توسط برچسب کلی را اصلاح یا محدود میکنند. برای اطلاعات بیشتر در مورد برچسبهای زبانی، به برچسبهای شناسایی زبانها مراجعه کنید. برای استفاده از یک برچسب زبان BCP 47، اگر کاربران زبان خود را در تنظیمات سیستم تغییر دهند، برچسب زبان میتواند در طول عمر برنامه شما تغییر کند. برای اطلاعات بیشتر در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به بخش مدیریت تغییرات پیکربندی مراجعه کنید. برای راهنمای کامل بومیسازی برنامه خود برای زبانهای دیگر، به بومیسازی برنامه خود مراجعه کنید. همچنین به متد |
| جنسیت دستوری | masculinefeminineneuter | جنسیت دستوری کاربر. برای زبانهایی که جنسیت دستوری دارند استفاده میشود. برای مثال، اگر نیاز دارید منابع مختلفی را برای کاربران فرانسوی زبان فراهم کنید، میتوانید از دایرکتوریهایی مانند زیر استفاده کنید: به بخش «شخصیسازی رابط کاربری برنامه با جنسیت دستوری» مراجعه کنید. همچنین به متد پیکربندی در سطح API 34 اضافه شد. |
| طیف رنگی گسترده | widecgnowidecg |
در سطح API 26 اضافه شد. همچنین به روش پیکربندی |
| محدوده دینامیکی بالا (HDR) | highdrlowdr |
در سطح API 26 اضافه شد. همچنین به روش پیکربندی |
| حالت رابط کاربری | cardesktelevisionappliancewatchvrheadset |
در سطح API 8 اضافه شد؛ تلویزیون در API 13 اضافه شد؛ دستگاه در API 16 اضافه شد؛ ساعت در API 20 اضافه شد؛ هدست واقعیت مجازی در API 26 اضافه شد. برای کسب اطلاعات در مورد نحوه واکنش برنامه شما هنگام وارد کردن یا برداشتن دستگاه از داک، بخش تعیین و نظارت بر وضعیت و نوع داک را مطالعه کنید. این میتواند در طول عمر برنامه شما تغییر کند اگر کاربر دستگاه را در یک داک قرار دهد. میتوانید برخی از این حالتها را با استفاده از |
| حالت شب | nightnotnight |
در سطح API 8 اضافه شد. اگر حالت شب در حالت خودکار (پیشفرض) باقی بماند، این میتواند در طول عمر برنامه شما تغییر کند، که در این صورت حالت بر اساس زمان روز تغییر میکند. میتوانید این حالت را با استفاده از |
| تراکم پیکسل صفحه نمایش (dpi) | ldpimdpihdpixhdpixxhdpixxxhdpinodpitvdpianydpinnn dpi |
نسبت مقیاسبندی ۳:۴:۶:۸:۱۲:۱۶ بین شش چگالی اولیه وجود دارد (با نادیده گرفتن چگالی tvdpi). بنابراین، یک بیتمپ ۹x۹ در ldpi، ۱۲x۱۲ در mdpi، ۱۸x۱۸ در hdpi، ۲۴x۲۴ در xhdpi و غیره است. نکته: استفاده از یک توصیفکننده چگالی به این معنی نیست که منابع فقط برای صفحاتی با آن چگالی هستند. اگر منابع جایگزینی با توصیفکنندههایی که با پیکربندی دستگاه فعلی مطابقت بیشتری دارند ارائه ندهید، سیستم از منابعی که بهترین تطابق را دارند استفاده میکند. برای اطلاعات بیشتر در مورد نحوه مدیریت تراکمهای مختلف صفحه نمایش و اینکه چگونه اندروید ممکن است بیتمپهای شما را برای تطبیق با تراکم فعلی مقیاسبندی کند، به نمای کلی سازگاری صفحه نمایش مراجعه کنید. |
| نوع صفحه لمسی | notouchfinger |
همچنین به فیلد پیکربندی |
| در دسترس بودن صفحه کلید | keysexposedkeyshiddenkeyssoft |
اگر منابع این میتواند در طول اجرای برنامه شما تغییر کند، اگر کاربر یک صفحه کلید سختافزاری را باز کند. برای اطلاعات بیشتر در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به بخش مدیریت تغییرات پیکربندی مراجعه کنید. همچنین به فیلدهای پیکربندی |
| روش ورودی متن اولیه | nokeysqwerty12key |
همچنین به فیلد پیکربندی |
| در دسترس بودن کلید ناوبری | navexposednavhidden |
اگر کاربر کلیدهای ناوبری را فاش کند، این میتواند در طول عمر برنامه شما تغییر کند. برای اطلاعات بیشتر در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به بخش مدیریت تغییرات پیکربندی مراجعه کنید. همچنین به فیلد پیکربندی |
| روش ناوبری غیر لمسی اولیه | nonavdpadtrackballwheel |
همچنین به فیلد پیکربندی |
| نسخه پلتفرم (سطح API) | مثالها:v3v4v7و غیره | سطح API پشتیبانی شده توسط دستگاه. به عنوان مثال، |
توجه: همه نسخههای اندروید از همه توصیفکنندهها پشتیبانی نمیکنند. استفاده از یک توصیفکننده جدید، توصیفکننده نسخه پلتفرم را به طور ضمنی اضافه میکند تا دستگاههای قدیمیتر بتوانند آن را نادیده بگیرند. برای جلوگیری از هرگونه مشکل، همیشه مجموعهای از منابع پیشفرض (مجموعهای از منابع بدون توصیفکننده ) را در نظر بگیرید. برای اطلاعات بیشتر، به بخش مربوط به ارائه بهترین سازگاری دستگاه با منابع مراجعه کنید.
در برنامههای Compose، توصیفکنندههای پیکربندی مربوط به طرحبندی و ابعاد مورد نیاز نیستند. اگرچه هنوز وجود دارند، اما از جدول 2 حذف شدهاند. این توصیفکنندهها عبارتند از: جهت طرحبندی، کمترین عرض، عرض موجود، ارتفاع موجود، اندازه صفحه نمایش، نسبت صفحه نمایش، صفحه نمایش گرد و جهت صفحه نمایش. برای مشاهده جدول کامل توصیفکنندههای پیکربندی به ترتیب اولویت، به نمای کلی منابع برنامه (Views) مراجعه کنید.
قوانین نام واجد شرایط
در اینجا چند قانون در مورد استفاده از نامهای توصیفکننده پیکربندی آمده است:
- شما میتوانید برای یک مجموعه از منابع، چندین توصیفکننده (qualifier) تعیین کنید که با خط تیره از هم جدا شدهاند. برای مثال،
drawable-en-rUS-nightبرای دستگاههای US-English در حالت شب اعمال میشود. - ترتیب قرار گرفتن گزینهها باید مطابق جدول ۲ باشد.
- اشتباه:
drawable-hdpi-night/ - صحیح:
drawable-night-hdpi/
- اشتباه:
- دایرکتوریهای منابع جایگزین را نمیتوان تو در تو تعریف کرد. برای مثال، نمیتوانید
res/drawable/drawable-en/داشته باشید. - مقادیر به حروف کوچک و بزرگ حساس نیستند. کامپایلر منابع، نام دایرکتوریها را قبل از پردازش به حروف کوچک تبدیل میکند تا از بروز مشکلات در سیستمهای فایل غیر حساس به حروف کوچک و بزرگ جلوگیری شود. هرگونه استفاده از حروف بزرگ در نامها فقط برای افزایش خوانایی است.
- فقط یک مقدار برای هر نوع توصیفگر پشتیبانی میشود. برای مثال، اگر میخواهید از فایلهای drawable یکسان برای اسپانیا و فرانسه استفاده کنید، نمیتوانید دایرکتوری به نام
drawable-es-fr/داشته باشید. در عوض، به دو دایرکتوری منبع مانندdrawable-es/وdrawable-fr/نیاز دارید که شامل فایلهای مناسب باشند.
پس از اینکه منابع جایگزین را در دایرکتوریهایی که با این توصیفکنندهها نامگذاری شدهاند ذخیره کردید، اندروید به طور خودکار منابع را بر اساس پیکربندی فعلی دستگاه در برنامه شما اعمال میکند. هر بار که منبعی درخواست میشود، اندروید دایرکتوریهای منابع جایگزین را که حاوی فایل منبع درخواستی هستند بررسی میکند، سپس بهترین منبع منطبق را پیدا میکند .
اگر هیچ منبع جایگزینی که با پیکربندی خاص دستگاه مطابقت داشته باشد، وجود نداشته باشد، اندروید از منابع پیشفرض مربوطه استفاده میکند - مجموعهای از منابع برای یک نوع منبع خاص که شامل توصیفکننده پیکربندی نمیشود.
ایجاد منابع مستعار
وقتی منبعی دارید که میخواهید برای بیش از یک پیکربندی دستگاه از آن استفاده کنید اما نمیخواهید آن را به عنوان منبع پیشفرض ارائه دهید، نیازی نیست همان منبع را در بیش از یک دایرکتوری منبع جایگزین قرار دهید. در عوض، میتوانید یک منبع جایگزین ایجاد کنید که به عنوان نام مستعار برای منبعی که در دایرکتوری منبع پیشفرض شما ذخیره شده است، عمل کند.
ترسیمپذیرها
برای مثال، تصور کنید که یک آیکون برنامه icon.png دارید و به یک نسخه منحصر به فرد از آن برای زبانهای مختلف نیاز دارید. با این حال، دو زبان، انگلیسی-کانادایی و فرانسوی-کانادایی، باید از یک نسخه استفاده کنند. نیازی نیست که تصویر یکسانی را برای هر دو زبان انگلیسی-کانادایی و فرانسوی-کانادایی در دایرکتوری منبع کپی کنید. در عوض، میتوانید تصویری را که برای هر دو زبان استفاده میشود، با نامی غیر از icon.png ، مانند icon_ca.png ، ذخیره کنید و آن را در دایرکتوری پیشفرض res/drawable/ قرار دهید. سپس یک فایل icon.xml در res/drawable-en-rCA/ و res/drawable-fr-rCA/ ایجاد کنید که با استفاده از عنصر <bitmap> به منبع icon_ca.png اشاره میکند.
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon_ca" />
این به شما امکان میدهد فقط یک نسخه از فایل PNG و دو فایل XML کوچک که به آن اشاره میکنند را ذخیره کنید. سپس میتوانید از painterResource(R.drawable.icon) استفاده کنید و سیستم پس از تشخیص زبان، فایل مناسب را انتخاب میکند.
رشتهها و سایر مقادیر ساده
برای ایجاد یک نام مستعار برای یک رشته موجود، از شناسه منبع رشته مورد نظر به عنوان مقدار رشته جدید استفاده کنید:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello</string> <string name="hi">@string/hello</string> </resources>
منبع R.string.hi اکنون یک نام مستعار برای R.string.hello است.
سایر مقادیر ساده نیز به همین روش کار میکنند، مانند رنگها:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="red">#f00</color> <color name="highlight">@color/red</color> </resources>
به منابع برنامه خود دسترسی پیدا کنید
زمانی که منبعی را در برنامه خود ارائه میدهید، میتوانید با ارجاع به شناسه منبع آن، آن را اعمال کنید. همه شناسههای منبع در کلاس R پروژه شما تعریف میشوند که ابزار aapt به طور خودکار آن را تولید میکند.
وقتی برنامه شما کامپایل میشود، aapt کلاس R را تولید میکند که شامل شناسههای منابع برای تمام منابع موجود در دایرکتوری res/ شما است. برای هر نوع منبع، یک زیرکلاس R وجود دارد، مانند R.drawable برای همه منابع قابل ترسیم. و برای هر منبع از آن نوع، یک عدد صحیح استاتیک وجود دارد، به عنوان مثال، R.drawable.icon . این عدد صحیح، شناسه منبعی است که میتوانید برای بازیابی منبع خود از آن استفاده کنید.
اگرچه کلاس R جایی است که شناسههای منابع مشخص میشوند، اما نیازی نیست برای یافتن شناسه منبع به آنجا مراجعه کنید. شناسه منبع همیشه از موارد زیر تشکیل شده است:
- نوع منبع : هر منبع در یک «نوع» مانند
stringیاdrawableگروهبندی میشود. - نام منبع ، که همان نام فایل بدون احتساب پسوند است.
دسترسی به منابع در Compose
Jetpack Compose توابع داخلی و سازگار با قابلیت ترکیب را برای دسترسی ایمن به منابع فراهم میکند.
- رشتهها:
stringResource(id = R.string.hello)
- فایلهای قابل ترسیم:
painterResource(id = R.drawable.my_icon)
دسترسی به منابع در کد غیر UI
اگر نیاز به دسترسی به منابع خارج از سلسله مراتب رابط کاربری خود دارید - مانند ViewModel ، Repository یا یک Service سیستم - میتوانید آنها را با استفاده از Context برطرف کنید.
// Retrieve a localized string resource val greeting = context.getString(R.string.hello_world)
همچنین میتوانید منابع منفرد را با استفاده از متدهای موجود در Resources بازیابی کنید، که میتوانید با getResources نمونهای از آنها را دریافت کنید.
نحو
نحوهی ارجاع به یک منبع در کد به صورت زیر است:
[<package_name>.]R.<resource_type>.<resource_name>
-
<package_name>نام بستهای است که منبع در آن قرار دارد (هنگام ارجاع به منابع از بسته خودتان لازم نیست). -
<resource_type>زیرکلاسRبرای نوع منبع است. -
<resource_name>یا نام فایل منبع بدون پسوند است یا برای مقادیر ساده، مقدار ویژگیandroid:nameدر عنصر XML است.
برای اطلاعات بیشتر در مورد هر نوع منبع و نحوه ارجاع به آنها، به منابع در Compose مراجعه کنید.
دسترسی به فایلهای اصلی
اگرچه غیرمعمول است، اما ممکن است نیاز به دسترسی به فایلها و دایرکتوریهای اصلی خود داشته باشید. اگر این کار را انجام دهید، ذخیره فایلهایتان در res/ برای شما کار نخواهد کرد، زیرا تنها راه خواندن یک منبع از res/ با شناسه منبع است. در عوض، میتوانید منابع خود را در دایرکتوری assets/ ذخیره کنید.
فایلهای ذخیره شده در دایرکتوری assets/ شناسه منبع ندارند ، بنابراین نمیتوانید از طریق کلاس R یا منابع XML به آنها ارجاع دهید. در عوض، میتوانید مانند یک سیستم فایل معمولی، فایلهای موجود در دایرکتوری assets/ را جستجو کنید و دادههای خام را با استفاده از AssetManager بخوانید.
با این حال، اگر تنها چیزی که نیاز دارید توانایی خواندن دادههای خام (مانند یک فایل ویدیویی یا صوتی) است، فایل را در دایرکتوری res/raw/ ذخیره کنید و با استفاده از openRawResource جریانی از بایتها را بخوانید.
دسترسی به منابع پلتفرم
اندروید شامل تعدادی منابع استاندارد، مانند استایلهای سیستم و تمها است. برای دسترسی به این موارد، مرجع منابع خود را با کلاس پکیج android تعریف کنید. به عنوان مثال: painterResource(android.R.drawable.ic_menu_info_details) .
بهترین سازگاری دستگاه با منابع را ارائه دهید
برای اینکه برنامه شما از پیکربندیهای مختلف دستگاه پشتیبانی کند، بسیار مهم است که همیشه منابع پیشفرض را برای هر نوع منبعی که برنامه شما استفاده میکند، ارائه دهید.
برای مثال، اگر برنامه شما از چندین زبان پشتیبانی میکند، همیشه یک دایرکتوری values/ (که رشتههای شما در آن ذخیره میشوند) بدون توصیفکننده زبان و منطقه قرار دهید. اگر به جای آن، تمام فایلهای رشته خود را در دایرکتوریهایی قرار دهید که توصیفکننده زبان و منطقه دارند، برنامه شما هنگام اجرا روی دستگاهی که زبانی را که رشتههای شما از آن پشتیبانی نمیکند، تنظیم کرده است، از کار میافتد.
تا زمانی که values/ منابع پیشفرض را ارائه دهید، برنامه شما به درستی اجرا میشود، حتی اگر کاربر زبان ارائه شده را نفهمد. این بهتر از از کار افتادن برنامه است.
ارائه منابع پیشفرض نه تنها به این دلیل مهم است که برنامه شما ممکن است روی پیکربندیای اجرا شود که شما پیشبینی نکردهاید، بلکه به این دلیل نیز هست که نسخههای جدید اندروید گاهی اوقات توصیفکنندههای پیکربندی را اضافه میکنند که نسخههای پایینتر از آنها پشتیبانی نمیکنند. اگر از توصیفکننده منبع جدید استفاده کنید، اما سازگاری کد را با نسخههای پایینتر اندروید حفظ کنید، وقتی نسخه پایینتر اندروید برنامه شما را اجرا میکند، اگر منابع پیشفرض را ارائه ندهید، برنامه از کار میافتد، زیرا نمیتواند از منابع نامگذاری شده با توصیفکننده جدید استفاده کند.
برای مثال، اگر minSdkVersion شما روی ۴ تنظیم شده باشد، و شما تمام منابع drawable خود را با استفاده از حالت شب ( night یا notnight که در API سطح ۸ اضافه شدهاند) واجد شرایط کنید، آنگاه یک دستگاه API سطح ۴ نمیتواند به منابع drawable شما دسترسی پیدا کند و از کار میافتد. در این حالت، احتمالاً میخواهید notnight منابع پیشفرض شما باشد، بنابراین آن واجد شرایط را حذف کنید و منابع drawable خود را در drawable/ یا drawable-night/ قرار دهید.
به طور خلاصه، برای ارائه بهترین سازگاری با دستگاه، همیشه منابع پیشفرض را برای منابعی که برنامه شما برای عملکرد صحیح به آنها نیاز دارد، فراهم کنید. سپس با استفاده از توصیفکنندههای پیکربندی، منابع جایگزین را برای پیکربندیهای خاص دستگاه ایجاد کنید.
یک استثنا برای این قانون وجود دارد: اگر minSdkVersion برنامه شما ۴ یا بیشتر باشد، وقتی منابع drawable جایگزین را با تعیینکننده تراکم صفحه نمایش ارائه میدهید، نیازی به منابع drawable پیشفرض ندارید . حتی بدون منابع drawable پیشفرض، اندروید میتواند بهترین تطابق را بین تراکمهای صفحه نمایش جایگزین پیدا کند و بیتمپها را در صورت لزوم مقیاسبندی کند. با این حال، برای بهترین تجربه در همه نوع دستگاهها، drawableهای جایگزین را برای هر سه نوع تراکم ارائه دهید.
چگونه اندروید بهترین منبع منطبق را پیدا میکند
وقتی منبعی را درخواست میکنید که برای آن جایگزینهایی ارائه میدهید، اندروید بسته به پیکربندی فعلی دستگاه، منبع جایگزین مورد استفاده را در زمان اجرا انتخاب میکند. برای نشان دادن نحوه انتخاب یک منبع جایگزین توسط اندروید، فرض کنید دایرکتوریهای drawable زیر هر کدام حاوی نسخههای مختلفی از تصاویر یکسان هستند:
drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/
و فرض کنید پیکربندی دستگاه به صورت زیر است:
زبان = en-GB
حالت شب = night
تراکم پیکسل صفحه نمایش = hdpi
نوع صفحه لمسی = notouch
روش ورودی متن اصلی = 12key
با مقایسه پیکربندی دستگاه با منابع جایگزین موجود، اندروید drawableها را از drawable-en-night انتخاب میکند.
سیستم با منطق زیر تصمیم میگیرد که از کدام منابع استفاده کند:

شکل ۲. فلوچارت چگونگی یافتن بهترین منبع منطبق توسط اندروید.
- فایلهای منبعی که با پیکربندی دستگاه مغایرت دارند را حذف کنید.
دایرکتوری
drawable-fr-rCA/حذف شده است، زیرا با زبانen-GBدر تضاد است.drawable/ drawable-en/
drawable-fr-rCA/drawable-en-night/ drawable-en-notouch-12key/ drawable-night-ldpi/ drawable-night-notouch-12key/استثنا: تراکم پیکسل صفحه نمایش تنها توصیفی است که به دلیل تناقض حذف نمیشود. حتی اگر تراکم صفحه نمایش دستگاه hdpi باشد،
drawable-night-ldpi/حذف نمیشود زیرا هر تراکم صفحه نمایشی در این مرحله منطبق در نظر گرفته میشود. برای اطلاعات بیشتر، به نمای کلی سازگاری صفحه نمایش مراجعه کنید. - توصیفگر با بالاترین اولویت بعدی را در لیست پیدا کنید ( جدول 2 ). (با MCC شروع کنید.)
- آیا هیچ یک از دایرکتوریهای منابع شامل این توصیفکننده هستند؟
- اگر نه، به مرحله دوم برگردید و به توصیفگر بعدی نگاه کنید. در این مثال، تا زمانی که به توصیفگر زبان نرسیدهاید، پاسخ «نه» است.
- اگر بله، به مرحله چهارم ادامه دهید.
- دایرکتوریهای منابعی که شامل این توصیفکننده نیستند را حذف کنید. در این مثال، سیستم در مرحله بعد تمام دایرکتوریهایی را که شامل توصیفکننده زبان نیستند، حذف میکند:
drawable/drawable-en/ drawable-en-night/ drawable-en-notouch-12key/drawable-night-ldpi/drawable-night-notouch-12key/استثنا: اگر معیار مورد نظر تراکم پیکسل صفحه نمایش باشد، اندروید گزینهای را انتخاب میکند که بیشترین تطابق را با تراکم صفحه نمایش دستگاه داشته باشد. به طور کلی، اندروید ترجیح میدهد تصویر اصلی بزرگتر را کوچکتر از تصویر اصلی کوچکتر بزرگ کند. برای اطلاعات بیشتر، به نمای کلی سازگاری صفحه نمایش مراجعه کنید.
- مراحل دو، سه و چهار را تکرار کنید تا فقط یک دایرکتوری باقی بماند. در این مثال، حالت شب، توصیفکنندهی بعدی است که برای آن تطابقی وجود دارد. بنابراین، منابعی که حالت شب را مشخص نمیکنند، حذف میشوند:
drawable-en/drawable-en-night/drawable-en-notouch-12key/دایرکتوری باقیمانده
drawable-en-nightاست.
اگرچه این رویه برای هر منبع درخواستی اجرا میشود، سیستم برخی از جنبههای آن را بهینه میکند. یکی از این بهینهسازیها این است که پس از مشخص شدن پیکربندی دستگاه، ممکن است منابع جایگزینی را که هرگز نمیتوانند مطابقت داشته باشند، حذف کند. به عنوان مثال، اگر زبان پیکربندی انگلیسی باشد، هر دایرکتوری منبعی که توصیفکننده زبان آن روی چیزی غیر از انگلیسی تنظیم شده باشد، هرگز در مجموعه منابع بررسی شده قرار نمیگیرد (اگرچه یک دایرکتوری منبع بدون توصیفکننده زبان همچنان شامل میشود).
هنگام انتخاب منابع بر اساس معیارهای اندازه صفحه نمایش، اگر منابعی که با صفحه نمایش فعلی مطابقت بیشتری داشته باشند وجود نداشته باشد، سیستم از منابعی که برای صفحه نمایش کوچکتر از صفحه نمایش فعلی طراحی شدهاند، استفاده میکند. به عنوان مثال، یک صفحه نمایش با اندازه بزرگ در صورت لزوم از منابع صفحه نمایش با اندازه معمولی استفاده میکند.
با این حال، اگر تنها منابع موجود بزرگتر از صفحه نمایش فعلی باشند، سیستم از آنها استفاده نمیکند و اگر هیچ منبع دیگری با پیکربندی دستگاه مطابقت نداشته باشد، برنامه شما از کار میافتد. برای مثال، این اتفاق میافتد اگر همه منابع طرحبندی با توصیفگر xlarge برچسبگذاری شده باشند، اما دستگاه یک صفحه نمایش با اندازه معمولی داشته باشد.
نکته: اولویت توصیفکننده (در جدول ۲ ) از تعداد توصیفکنندههایی که دقیقاً با دستگاه مطابقت دارند، مهمتر است. در مثال قبلی، در مرحله چهارم، آخرین انتخاب در لیست شامل سه توصیفکننده است که دقیقاً با دستگاه مطابقت دارند (حالت شب، نوع صفحه لمسی و روش ورودی)، در حالی که drawable-en فقط یک پارامتر دارد که با آن مطابقت دارد (زبان). با این حال، زبان اولویت بالاتری نسبت به این توصیفکنندههای دیگر دارد، بنابراین drawable-night-notouch-12key حذف میشود.
منابع اضافی
برای کسب اطلاعات بیشتر در مورد منابع برنامه، به منابع اضافی زیر مراجعه کنید: