مروری بر منابع برنامه

منابع، فایل‌های اضافی و محتوای استاتیکی هستند که کد شما از آنها استفاده می‌کند، مانند بیت‌مپ‌ها، رشته‌های رابط کاربری، دستورالعمل‌های انیمیشن و موارد دیگر.

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

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

انواع منابع گروهی

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

MyProject/
    src/
        MyActivity.kt
    res/
        drawable/
            graphic.png
        mipmap/
            icon.png
        values/
            strings.xml

دایرکتوری res/ شامل تمام منابع موجود در زیرشاخه‌های خود است: یک منبع تصویر، یک دایرکتوری mipmap/ برای آیکون‌های لانچر و یک فایل منبع رشته‌ای. نام دایرکتوری‌های منابع مهم هستند و در جدول ۱ توضیح داده شده‌اند.

نکته: برای اطلاعات بیشتر در مورد استفاده از پوشه‌های mipmap، به بخش «قرار دادن آیکون‌های برنامه در دایرکتوری‌های mipmap» مراجعه کنید.

جدول ۱. دایرکتوری‌های منابع پشتیبانی‌شده در دایرکتوری res/ پروژه.

دایرکتوری نوع منبع
drawable/

فایل‌های بیت‌مپ (PNG، .9.png ، JPG یا GIF) یا فایل‌های XML که به زیرگروه‌های منابع ترسیمی زیر کامپایل می‌شوند:

  • فایل‌های بیت‌مپ
  • نه وصله (بیت‌مپ‌های قابل تغییر اندازه)
  • فهرست‌های ایالتی
  • اشکال
  • انیمیشن‌های قابل ترسیم
  • سایر فایل‌های قابل ترسیم

برای اطلاعات بیشتر، به منابع Drawable مراجعه کنید.

mipmap/ فایل‌های قابل ترسیم برای تراکم‌های مختلف آیکون‌های لانچر. برای اطلاعات بیشتر در مورد مدیریت آیکون‌های لانچر با پوشه‌های mipmap/ ، به بخش «قرار دادن آیکون‌های برنامه در دایرکتوری‌های mipmap» مراجعه کنید.
raw/

فایل‌های دلخواه برای ذخیره به شکل خام خود. برای باز کردن این منابع با InputStream خام، Resources.openRawResource را با شناسه منبع که R.raw. filename است، فراخوانی کنید.

با این حال، اگر به دسترسی به نام اصلی فایل‌ها و سلسله مراتب فایل‌ها نیاز دارید، ذخیره منابع در دایرکتوری assets/ را به جای res/raw/ در نظر بگیرید. فایل‌های موجود در assets/ شناسه منبع ندارند، بنابراین فقط می‌توانید آن‌ها را با استفاده از AssetManager بخوانید.

values/

فایل‌های XML که حاوی مقادیر ساده‌ای مانند رشته‌ها، اعداد صحیح و رنگ‌ها هستند.

در حالی که فایل‌های منبع XML در سایر زیرشاخه‌های res/ یک منبع واحد را بر اساس نام فایل XML تعریف می‌کنند، فایل‌های موجود در پوشه values/ چندین منبع را توصیف می‌کنند. برای یک فایل در این پوشه، هر فرزند عنصر <resources> یک منبع واحد را تعریف می‌کند. به عنوان مثال، یک عنصر <string> یک منبع R.string ایجاد می‌کند و یک عنصر <color> یک منبع R.color ایجاد می‌کند.

از آنجا که هر منبع با عنصر 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 مراجعه کنید.

منابع جایگزین ارائه دهید

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

برای مشخص کردن گزینه‌های خاص پیکربندی برای مجموعه‌ای از منابع، موارد زیر را انجام دهید:

  1. یک دایرکتوری جدید در res/ ایجاد کنید که به شکل <resources_name> - <qualifier> نامگذاری شده باشد.
    • <resources_name> نام دایرکتوری منابع پیش‌فرض مربوطه است (تعریف شده در جدول ۱).
    • <qualifier> نامی است که پیکربندی منحصر به فردی را که این منابع برای آن استفاده می‌شوند، مشخص می‌کند (تعریف شده در جدول 2).

    می‌توانید بیش از یک <qualifier> اضافه کنید. هر کدام را با یک خط تیره از هم جدا کنید.

    احتیاط: هنگام افزودن چندین توصیف‌کننده، باید آنها را به همان ترتیبی که در جدول ۲ فهرست شده‌اند، قرار دهید. اگر توصیف‌کننده‌ها به طور نادرست مرتب شده باشند، منابع نادیده گرفته می‌شوند.

  2. منابع جایگزین مناسب را در این دایرکتوری جدید ذخیره کنید. فایل‌های منبع باید دقیقاً مشابه فایل‌های منبع پیش‌فرض نامگذاری شوند.

برای مثال، در اینجا برخی از منابع پیش‌فرض و جایگزین آورده شده است:

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 مثال‌ها:
mcc310
mcc310-mnc004
mcc208-mnc00

کد کشور تلفن همراه (MCC)، که به صورت اختیاری با کد شبکه تلفن همراه (MNC) از سیم کارت موجود در دستگاه دنبال می‌شود. به عنوان مثال، mcc310 در هر اپراتوری مربوط به ایالات متحده است، mcc310-mnc004 در Verizon مربوط به ایالات متحده است و mcc208-mnc00 در Orange مربوط به فرانسه است.

اگر دستگاه از اتصال رادیویی استفاده می‌کند (یعنی یک تلفن GSM است)، مقادیر MCC و MNC از سیم کارت می‌آیند.

همچنین می‌توانید به تنهایی از MCC استفاده کنید، برای مثال، برای گنجاندن منابع حقوقی خاص کشور در برنامه خود. اگر نیاز دارید که فقط بر اساس زبان مشخص کنید، به جای آن از توصیف‌کننده زبان، خط (اختیاری) و منطقه (اختیاری) استفاده کنید. اگر از توصیف‌کننده MCC و MNC استفاده می‌کنید، این کار را با دقت انجام دهید و آزمایش کنید که مطابق انتظار کار کند.

همچنین به فیلدهای پیکربندی mcc و mnc مراجعه کنید که به ترتیب کد کشور موبایل و کد شبکه موبایل فعلی را نشان می‌دهند.

زبان، خط (اختیاری) و منطقه (اختیاری) مثال‌ها:
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419
b+zh+Hant
b+sr+Latn+RS

این زبان با یک کد زبان دو حرفی ISO 639-1 تعریف می‌شود که به صورت اختیاری با یک کد منطقه دو حرفی ISO 3166-1-alpha-2 (که قبل از آن r کوچک قرار می‌گیرد) دنبال می‌شود.

کدها به حروف کوچک و بزرگ حساس نیستند . پیشوند r برای تمایز بخش منطقه استفاده می‌شود. شما نمی‌توانید فقط یک منطقه را مشخص کنید.

اندروید ۷.۰ (سطح API ۲۴) پشتیبانی از برچسب‌های زبانی BCP 47 را معرفی کرد که می‌توانید از آن‌ها برای تعیین صلاحیت منابع خاص زبان و منطقه استفاده کنید. یک برچسب زبانی از دنباله‌ای از یک یا چند زیربرچسب تشکیل شده است که هر کدام از آن‌ها دامنه زبان شناسایی شده توسط برچسب کلی را اصلاح یا محدود می‌کنند. برای اطلاعات بیشتر در مورد برچسب‌های زبانی، به برچسب‌های شناسایی زبان‌ها مراجعه کنید.

برای استفاده از یک برچسب زبان BCP 47، b+ و یک کد زبان دو حرفی ISO 639-1 را به هم متصل کنید، که به صورت اختیاری با زیربرچسب‌های اضافی که با + از هم جدا شده‌اند، دنبال می‌شود.

اگر کاربران زبان خود را در تنظیمات سیستم تغییر دهند، برچسب زبان می‌تواند در طول عمر برنامه شما تغییر کند. برای اطلاعات بیشتر در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به بخش مدیریت تغییرات پیکربندی مراجعه کنید.

برای راهنمای کامل بومی‌سازی برنامه خود برای زبان‌های دیگر، به بومی‌سازی برنامه خود مراجعه کنید.

همچنین به متد getLocales مراجعه کنید که لیست تعریف‌شده‌ی زبان‌ها را ارائه می‌دهد. این لیست شامل زبان اصلی است.

جنسیت دستوری masculine
feminine
neuter

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

برای مثال، اگر نیاز دارید منابع مختلفی را برای کاربران فرانسوی زبان فراهم کنید، می‌توانید از دایرکتوری‌هایی مانند زیر استفاده کنید:

res/
values-fr/
strings.xml (رشته‌های پیش‌فرض با جنسیت نامشخص)
values-fr-masculine/
strings.xml (رشته‌هایی با جنسیت مذکر)
values-fr-feminine/
strings.xml (رشته‌هایی با جنسیت مونث)
values-fr-neuter/
strings.xml (رشته‌هایی با جنسیت خنثی)

به بخش «شخصی‌سازی رابط کاربری برنامه با جنسیت دستوری» مراجعه کنید.

همچنین به متد پیکربندی getGrammaticalGender مراجعه کنید که جنسیت دستوری را نشان می‌دهد.

در سطح API 34 اضافه شد.

طیف رنگی گسترده widecg
nowidecg
  • widecg : نمایشگرهایی با طیف رنگی گسترده مانند Display P3 یا AdobeRGB
  • nowidecg : نمایشگرهایی با طیف رنگی محدود مانند sRGB

در سطح API 26 اضافه شد.

همچنین به روش پیکربندی isScreenWideColorGamut مراجعه کنید، که نشان می‌دهد آیا صفحه نمایش دارای طیف رنگی گسترده است یا خیر.

محدوده دینامیکی بالا (HDR) highdr
lowdr
  • highdr : نمایشگرهایی با محدوده دینامیکی بالا
  • lowdr : نمایشگرهایی با محدوده دینامیکی پایین/استاندارد

در سطح API 26 اضافه شد.

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

حالت رابط کاربری car
desk
television
appliance
watch
vrheadset
  • car : دستگاه در جایگاه مخصوص ماشین نمایش داده می‌شود
  • desk : دستگاه در داک میز نمایش داده می‌شود
  • television : دستگاه روی تلویزیون نمایش داده می‌شود و یک تجربه "ده فوتی" را ارائه می‌دهد که در آن رابط کاربری روی یک صفحه نمایش بزرگ است که کاربر از آن دور است و این تجربه عمدتاً حول محور D-pad یا سایر تعاملات غیر اشاره‌گری متمرکز است.
  • appliance : دستگاه به عنوان یک دستگاه عمل می‌کند، بدون صفحه نمایش
  • watch : دستگاهی که صفحه نمایش دارد و روی مچ دست بسته می‌شود
  • vrheadset : دستگاه در یک هدست واقعیت مجازی نمایش داده می‌شود

در سطح API 8 اضافه شد؛ تلویزیون در API 13 اضافه شد؛ دستگاه در API 16 اضافه شد؛ ساعت در API 20 اضافه شد؛ هدست واقعیت مجازی در API 26 اضافه شد.

برای کسب اطلاعات در مورد نحوه واکنش برنامه شما هنگام وارد کردن یا برداشتن دستگاه از داک، بخش تعیین و نظارت بر وضعیت و نوع داک را مطالعه کنید.

این می‌تواند در طول عمر برنامه شما تغییر کند اگر کاربر دستگاه را در یک داک قرار دهد. می‌توانید برخی از این حالت‌ها را با استفاده از UiModeManager فعال یا غیرفعال کنید. برای اطلاعات در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به Handle configuration changes مراجعه کنید.

حالت شب night
notnight
  • night : شب هنگام
  • notnight : روز

در سطح API 8 اضافه شد.

اگر حالت شب در حالت خودکار (پیش‌فرض) باقی بماند، این می‌تواند در طول عمر برنامه شما تغییر کند، که در این صورت حالت بر اساس زمان روز تغییر می‌کند. می‌توانید این حالت را با استفاده از UiModeManager فعال یا غیرفعال کنید. برای اطلاعات در مورد چگونگی تأثیر این موضوع بر برنامه شما در زمان اجرا، به Handle configuration changes مراجعه کنید.

تراکم پیکسل صفحه نمایش (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnn dpi
  • ldpi : صفحات نمایش با چگالی کم؛ تقریباً ۱۲۰ نقطه در اینچ.
  • mdpi : صفحات نمایش با چگالی متوسط ​​(در HVGA سنتی)؛ تقریباً 160 نقطه در اینچ.
  • hdpi : صفحات نمایش با چگالی بالا؛ تقریباً 240 dpi.
  • xhdpi : صفحات نمایش با چگالی بسیار بالا؛ تقریباً 320 dpi. در سطح API 8 اضافه شده است.
  • xxhdpi : صفحات نمایش با چگالی فوق‌العاده بالا؛ تقریباً ۴۸۰ نقطه در اینچ. در سطح API 16 اضافه شد.
  • xxxhdpi : با چگالی بسیار بسیار بالا (فقط آیکون لانچر - به پشتیبانی از چگالی‌های پیکسلی مختلف مراجعه کنید)؛ تقریباً ۶۴۰ نقطه در اینچ. در سطح API 18 اضافه شد.
  • nodpi : برای منابع بیت‌مپ که نمی‌خواهید برای مطابقت با چگالی دستگاه مقیاس‌بندی شوند، استفاده می‌شود.
  • tvdpi : صفحه نمایش‌هایی که جایی بین mdpi و hdpi قرار دارند؛ تقریباً ۲۱۳ dpi. این یک گروه چگالی «اصلی» محسوب نمی‌شود. این گروه عمدتاً برای تلویزیون‌های ۷۲۰p در نظر گرفته شده است و اکثر برنامه‌ها به آن نیازی ندارند. برای پنل‌های تلویزیون ۱۰۸۰p، از xhdpi و برای پنل‌های تلویزیون ۴K، از xxxhdpi استفاده کنید. در سطح API ۱۳ اضافه شده است.
  • anydpi : با تمام تراکم‌های صفحه نمایش مطابقت دارد و بر سایر توصیف‌کننده‌ها اولویت دارد. این برای ترسیم‌های برداری مفید است. در سطح API 21 اضافه شده است.
  • nnn dpi : برای نمایش تراکم‌های غیراستاندارد استفاده می‌شود، که در آن nnn یک عدد صحیح مثبت برای تراکم صفحه نمایش است. این در بیشتر موارد استفاده نمی‌شود. استفاده از سطل‌های تراکم استاندارد، سربار پشتیبانی از تراکم‌های صفحه نمایش دستگاه‌های مختلف موجود در بازار را تا حد زیادی کاهش می‌دهد.

نسبت مقیاس‌بندی ۳:۴:۶:۸:۱۲:۱۶ بین شش چگالی اولیه وجود دارد (با نادیده گرفتن چگالی tvdpi). بنابراین، یک بیت‌مپ ۹x۹ در ldpi، ۱۲x۱۲ در mdpi، ۱۸x۱۸ در hdpi، ۲۴x۲۴ در xhdpi و غیره است.

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

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

نوع صفحه لمسی notouch
finger
  • notouch : دستگاه صفحه لمسی ندارد.
  • finger : دستگاه دارای صفحه لمسی است که برای استفاده از طریق تعامل مستقیم انگشت کاربر در نظر گرفته شده است.

همچنین به فیلد پیکربندی touchscreen مراجعه کنید که نوع صفحه لمسی دستگاه را نشان می‌دهد.

در دسترس بودن صفحه کلید keysexposed
keyshidden
keyssoft
  • keysexposed : دستگاه دارای صفحه‌کلید است. اگر دستگاه دارای صفحه‌کلید نرم‌افزاری فعال باشد (که احتمالاً چنین است)، این حتی زمانی که صفحه‌کلید سخت‌افزاری در دسترس کاربر نیست یا دستگاه صفحه‌کلید سخت‌افزاری ندارد، استفاده می‌شود. اگر هیچ صفحه‌کلید نرم‌افزاری ارائه نشده باشد یا غیرفعال باشد، این فقط زمانی استفاده می‌شود که صفحه‌کلید سخت‌افزاری در دسترس باشد.
  • keyshidden : دستگاه دارای یک صفحه کلید سخت‌افزاری است اما پنهان است و صفحه کلید نرم‌افزاری روی دستگاه فعال نیست .
  • keyssoft : دستگاه دارای یک صفحه‌کلید نرم‌افزاری فعال است، چه قابل مشاهده باشد چه نباشد.

اگر منابع keysexposed را ارائه دهید، اما منابع keyssoft ارائه ندهید، سیستم از منابع keysexposed صرف نظر از اینکه صفحه کلید قابل مشاهده باشد یا خیر، استفاده می‌کند، البته تا زمانی که سیستم صفحه کلید نرم‌افزاری را فعال کرده باشد.

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

همچنین به فیلدهای پیکربندی hardKeyboardHidden و keyboardHidden مراجعه کنید که به ترتیب نشان‌دهنده‌ی قابلیت مشاهده‌ی یک صفحه‌کلید سخت‌افزاری و قابلیت مشاهده‌ی هر نوع صفحه‌کلید (از جمله نرم‌افزار) هستند.

روش ورودی متن اولیه nokeys
qwerty
12key
  • nokeys : دستگاه هیچ کلید سخت‌افزاری برای ورود متن ندارد.
  • qwerty : دستگاه دارای یک صفحه کلید QWERTY سخت‌افزاری است، چه برای کاربر قابل مشاهده باشد چه نباشد.
  • 12key : دستگاه دارای یک صفحه‌کلید سخت‌افزاری ۱۲ کلیدی است، چه برای کاربر قابل مشاهده باشد چه نباشد.

همچنین به فیلد پیکربندی keyboard مراجعه کنید، که روش ورودی متن اصلی موجود را نشان می‌دهد.

نسخه پلتفرم (سطح API) مثال‌ها:
v3
v4
v7
و غیره

سطح API پشتیبانی شده توسط دستگاه. به عنوان مثال، v1 برای API سطح 1 (دستگاه‌های دارای اندروید 1.0 یا بالاتر) و v4 برای API سطح 4 (دستگاه‌های دارای اندروید 1.6 یا بالاتر). برای اطلاعات بیشتر در مورد این مقادیر، به سند سطوح 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 انتخاب می‌کند.

سیستم با منطق زیر تصمیم می‌گیرد که از کدام منابع استفاده کند:

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

  1. فایل‌های منبعی که با پیکربندی دستگاه مغایرت دارند را حذف کنید.

    دایرکتوری 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. توصیفگر با بالاترین اولویت بعدی را در لیست پیدا کنید ( جدول 2 ). (با MCC شروع کنید.)
  3. آیا هیچ یک از دایرکتوری‌های منابع شامل این توصیف‌کننده هستند؟
    • اگر نه، به مرحله دوم برگردید و به توصیفگر بعدی نگاه کنید. در این مثال، تا زمانی که به توصیفگر زبان نرسیده‌اید، پاسخ «نه» است.
    • اگر بله، به مرحله چهارم ادامه دهید.
  4. دایرکتوری‌های منابعی که شامل این توصیف‌کننده نیستند را حذف کنید. در این مثال، سیستم در مرحله بعد تمام دایرکتوری‌هایی را که شامل توصیف‌کننده زبان نیستند، حذف می‌کند:
    drawable/
    drawable-en/
    drawable-en-night/
    drawable-en-notouch-12key/
    drawable-night-ldpi/
    drawable-night-notouch-12key/
    

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

  5. مراحل دو، سه و چهار را تکرار کنید تا فقط یک دایرکتوری باقی بماند. در این مثال، حالت شب، توصیف‌کننده‌ی بعدی است که برای آن تطابقی وجود دارد. بنابراین، منابعی که حالت شب را مشخص نمی‌کنند، حذف می‌شوند:
    drawable-en/
    drawable-en-night/
    drawable-en-notouch-12key/
    

    دایرکتوری باقی‌مانده drawable-en-night است.

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

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

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

نکته: اولویت توصیف‌کننده (در جدول ۲ ) از تعداد توصیف‌کننده‌هایی که دقیقاً با دستگاه مطابقت دارند، مهم‌تر است. در مثال قبلی، در مرحله چهارم، آخرین انتخاب در لیست شامل سه توصیف‌کننده است که دقیقاً با دستگاه مطابقت دارند (حالت شب، نوع صفحه لمسی و روش ورودی)، در حالی که drawable-en فقط یک پارامتر دارد که با آن مطابقت دارد (زبان). با این حال، زبان اولویت بالاتری نسبت به این توصیف‌کننده‌های دیگر دارد، بنابراین drawable-night-notouch-12key حذف می‌شود.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد منابع برنامه، به منابع اضافی زیر مراجعه کنید:

مستندات

محتوا را مشاهده می‌کند