نظرة عامة على مراجع التطبيقات

الموارد هي الملفات الإضافية والمحتوى الثابت الذي يستخدمه الرمز، مثل الصور النقطية وتعريفات التنسيقات وسلاسل واجهة المستخدم وتعليمات الرسوم المتحركة وغير ذلك.

احرص دائمًا على فصل موارد التطبيق، مثل الصور والسلاسل، عن الرمز البرمجي، حتى تتمكّن من صيانتها بشكل مستقل. قدِّم أيضًا موارد بديلة لإعدادات أجهزة معيّنة من خلال تجميعها في أدلة موارد تحمل أسماء خاصة. أثناء وقت التشغيل، يستخدم Android المورد المناسب استنادًا إلى الإعدادات الحالية. على سبيل المثال، قد تحتاج إلى توفير تصميم مختلف لواجهة المستخدم استنادًا إلى حجم الشاشة أو سلاسل مختلفة استنادًا إلى إعدادات اللغة.

بعد نقل موارد تطبيقك إلى الخارج، يمكنك الوصول إليها باستخدام معرّفات الموارد التي يتم إنشاؤها في الفئة R الخاصة بمشروعك. يوضّح لك هذا المستند كيفية تجميع الموارد في مشروع Android. توضّح لك أيضًا كيفية توفير موارد بديلة لإعدادات أجهزة معيّنة، ثم الوصول إليها من رمز تطبيقك أو ملفات XML الأخرى.

أنواع موارد المجموعة

ضَع كل نوع من الموارد في دليل فرعي محدّد ضمن دليل res/ الخاص بمشروعك. على سبيل المثال، إليك التسلسل الهرمي للملفات في مشروع بسيط:

MyProject/
    src/
        MyActivity.java
    res/
        drawable/
            graphic.png
        layout/
            main.xml
            info.xml
        mipmap/
            icon.png
        values/
            strings.xml

يحتوي الدليل res/ على جميع الموارد في أدلته الفرعية: مورد صورة وموردان للتصميم ودليل mipmap/ لرموز مشغّل التطبيقات وملف مصدر السلاسل النصية. أسماء أدلة الموارد مهمة، وهي موضّحة في الجدول 1.

ملاحظة: لمزيد من المعلومات حول استخدام مجلدات mipmap، يُرجى الاطّلاع على وضع رموز التطبيقات في أدلة mipmap.

الجدول 1. يمكن استخدام أدلة الموارد داخل دليل المشروع res/.

الدليل نوع المورد
animator/ ملفات XML التي تحدّد الرسومات المتحركة الخاصة بالسمات
anim/ ملفات XML تحدد الرسوم المتحركة Tween. يمكن أيضًا حفظ حركات العناصر في هذا الدليل، ولكن يُفضّل استخدام الدليل animator/ لحركات العناصر من أجل التمييز بين النوعين.
color/ ملفات XML تحدّد قائمة حالات الألوان. لمزيد من المعلومات، يُرجى الاطّلاع على مورد قائمة حالات الألوان.
drawable/

ملفات الصور النقطية (PNG أو .9.png أو JPG أو GIF) أو ملفات XML التي يتم تجميعها في الأنواع الفرعية التالية من موارد الرسومات القابلة للرسم:

  • ملفات الصور النقطية
  • الصور النقطية ذات الأجزاء التسعة (الصور النقطية القابلة لتغيير الحجم)
  • قوائم الولايات
  • الأشكال
  • الرسومات القابلة للرسم الخاصة بالصور المتحركة
  • عناصر قابلة للرسم أخرى

لمزيد من المعلومات، يُرجى الاطّلاع على الموارد القابلة للرسم.

mipmap/ ملفات قابلة للرسم لكثافات مختلفة لرموز مشغّل التطبيق لمزيد من المعلومات حول إدارة رموز مشغّل التطبيقات باستخدام مجلدات mipmap/، يُرجى الاطّلاع على وضع رموز التطبيقات في أدلة mipmap.
layout/ ملفات XML التي تحدّد تخطيط واجهة المستخدم لمزيد من المعلومات، اطّلِع على مورد التنسيق.
menu/ ملفات XML تحدّد قوائم التطبيقات، مثل قائمة الخيارات أو قائمة السياقات أو القائمة الفرعية. لمزيد من المعلومات، يُرجى الاطّلاع على مورد القائمة.
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/. يؤدي ذلك إلى حدوث خطأ في برنامج التجميع.

لمزيد من المعلومات حول الأنواع الفردية للموارد، اطّلِع على نظرة عامة على أنواع الموارد.

الموارد التي تحفظها في الدلائل الفرعية المحدّدة في الجدول 1 هي مواردك التلقائية. أي أنّ هذه الموارد تحدّد التصميم والمحتوى التلقائيين لتطبيقك، إلا أنّ أنواع الأجهزة المختلفة التي تعمل بنظام التشغيل Android قد تتطلّب أنواعًا مختلفة من الموارد.

على سبيل المثال، يمكنك توفير موارد تنسيق مختلفة للأجهزة التي تحتوي على شاشات أكبر من المعتاد للاستفادة من مساحة الشاشة الإضافية. يمكنك أيضًا توفير موارد سلاسل مختلفة تترجم النص في واجهة المستخدم استنادًا إلى إعدادات اللغة على الجهاز. لتوفير هذه الموارد المختلفة لإعدادات الأجهزة المختلفة، عليك توفير موارد بديلة بالإضافة إلى الموارد التلقائية.

توفير مراجع بديلة

توفّر معظم التطبيقات موارد بديلة لتتوافق مع إعدادات أجهزة معيّنة. على سبيل المثال، أدرِج موارد رسومات قابلة للرسم بديلة لكثافات الشاشة المختلفة وموارد سلاسل بديلة للغات المختلفة. أثناء وقت التشغيل، يرصد نظام التشغيل Android إعدادات الجهاز الحالية ويحمّل الموارد المناسبة لتطبيقك.

الشكل 1: جهازان يستخدمان موارد تخطيط مختلفة استنادًا إلى حجم الشاشة

لتحديد بدائل خاصة بالإعدادات لمجموعة من الموارد، اتّبِع الخطوات التالية:

  1. أنشئ دليلاً جديدًا في res/ باسم بالصيغة <resources_name>-<qualifier>.
    • <resources_name> هو اسم دليل الموارد التلقائية المقابلة (المحدّدة في الجدول 1).
    • <qualifier> هو اسم يحدّد إعدادًا فرديًا سيتم استخدام هذه الموارد له (محدّد في الجدول 2).

    يمكنك إضافة أكثر من <qualifier>. افصل بين كل واحد منها بشرطة.

    تنبيه: عند إضافة عدة مؤهلات، يجب وضعها بالترتيب نفسه الذي تظهر به في الجدول 2. في حال ترتيب المؤهلات بشكل غير صحيح، يتم تجاهل الموارد.

  2. احفظ المراجع البديلة المناسبة في هذا الدليل الجديد. يجب أن تتطابق أسماء ملفات الموارد تمامًا مع أسماء ملفات الموارد التلقائية.

على سبيل المثال، إليك بعض المراجع التلقائية والبديلة:

res/
    drawable/
        icon.png
        background.png
    drawable-hdpi/
        icon.png
        background.png

يشير المؤهّل hdpi إلى أنّ الموارد الموجودة في هذا الدليل مخصّصة للأجهزة التي تحتوي على شاشة بدقة عالية. يتم تحديد حجم الصور في أدلة الرسومات القابلة للرسم هذه لتناسب كثافات شاشة معيّنة، ولكن تكون أسماء الملفات متطابقة تمامًا. بهذه الطريقة، يكون معرّف المورد الذي تستخدمه للإشارة إلى صورة icon.png أو background.png هو نفسه دائمًا. يختار نظام التشغيل Android إصدار كل مورد الذي يتطابق على أفضل وجه مع الجهاز الحالي من خلال مقارنة معلومات إعدادات الجهاز بالمحدّدات في اسم دليل الموارد.

تنبيه: عند تحديد مورد بديل، احرص على تحديد المورد أيضًا في إعداد تلقائي. وإلا، قد يواجه تطبيقك استثناءات وقت التشغيل عند تغيير الجهاز لأحد الإعدادات. على سبيل المثال، إذا أضفت سلسلة إلى values-en فقط وليس إلى values، قد يواجه تطبيقك استثناء Resource Not Found عند تغيير المستخدم للغة النظام التلقائية.

يسرد الجدول 2 مؤهلات الضبط الصالحة بترتيب الأسبقية. يمكنك إضافة مؤهلات متعددة إلى اسم دليل واحد من خلال الفصل بين كل مؤهل وآخر بشرطة. إذا كنت تستخدم مؤهّلات متعدّدة لدليل موارد، عليك إضافتها إلى اسم الدليل بالترتيب الذي تظهر به في الجدول.

الجدول 2. أسماء مؤهلات الإعداد

الإعدادات قيم المؤهِّل الوصف
رمز البلد ورمز الشبكة أمثلة:
mcc310
mcc310-mnc004
mcc208-mnc00

رمز البلد حيث يتم تشغيل شبكة الجوّال (MCC)، يليه اختياريًا معرِّف الشبكة (MNC) من شريحة SIM في الأجهزة على سبيل المثال، mcc310 هي الولايات المتحدة على أي شبكة جوّال، وmcc310-mnc004 هي الولايات المتحدة على شبكة Verizon، وmcc208-mnc00 هي فرنسا على شبكة Orange.

إذا كان الجهاز يستخدم اتصالاً لاسلكيًا (أي أنّه هاتف GSM)، يتم الحصول على قيمتَي رمز البلد المتنقل (MCC) ورمز شبكة الجوّال (MNC) من شريحة SIM.

يمكنك أيضًا استخدام رمز 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 لتمييز جزء المنطقة. لا يمكنك تحديد منطقة فقط.

أتاح نظام التشغيل Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) إمكانية استخدام علامات اللغة 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 (السلاسل التي تم تحديد الجنس فيها على أنّه محايد)

راجِع: التصريف اللغوي في Android.

يمكنك أيضًا الاطّلاع على طريقة الضبط getGrammaticalGender() التي تشير إلى الجنس النحوي.

تمت إضافته في مستوى واجهة برمجة التطبيقات 34.

اتجاه التنسيق ldrtl
ldltr

تمثّل هذه السمة اتجاه التنسيق في تطبيقك، حيث يشير ldrtl إلى "layout-direction-right-to-left". تعني ldltr "اتجاه التنسيق من اليمين إلى اليسار" وهي القيمة الضمنية التلقائية.

يمكن أن ينطبق ذلك على أي مورد، مثل التصاميم أو العناصر القابلة للرسم أو القيم.

على سبيل المثال، إذا أردت توفير تخطيط معيّن للغة العربية وتخطيط عام لأي لغة أخرى تُكتب من اليمين إلى اليسار، مثل الفارسية أو العبرية، يمكنك استخدام أدلة مثل ما يلي:

res/
  layout/
    main.xml (التنسيق التلقائي)
  layout-ar/
    main.xml (تنسيق خاص باللغة العربية)
  layout-ldrtl/
    main.xml (أي لغة تُكتب من اليمين إلى اليسار باستثناء اللغة العربية، لأنّ مؤهّل اللغة "ar" له أولوية أعلى)

ملاحظة: لتفعيل ميزات التنسيق من اليمين إلى اليسار في تطبيقك، يجب ضبط SupportsRtl على "true" وضبط TargetSdkVersion على 17 أو أعلى.

تمت إضافته في المستوى 17 من واجهة برمجة التطبيقات.

أصغر عرض sw<N>dp

أمثلة:
sw320dp
sw600dp
sw720dp
إلخ

أقصر بُعد لمساحة الشاشة المتاحة للتطبيق، وتحديدًا، smallestWidth نافذة التطبيق هو أقصر ارتفاع وعرض متاحَين للنافذة. ويمكنك أيضًا اعتبارها "أصغر عرض ممكن" للنافذة. يمكنك استخدام هذا المؤهّل ليتوفّر في تطبيقك عرض لا يقل عن <N> وحدة بكسل مستقلة الكثافة (dp) لواجهة المستخدم.

على سبيل المثال، إذا كان التصميم يتطلّب أن يكون أصغر بُعد لمساحة الشاشة 600 وحدة بكسل مستقلة الكثافة على الأقل في جميع الأوقات، يمكنك استخدام هذا المؤهِّل لإنشاء مورد التصميم في دليل res/layout-sw600dp/. لا يستخدم النظام هذه الموارد إلا عندما يكون أصغر بُعد للشاشة المتاحة 600 وحدة بكسل مستقل الكثافة على الأقل، بغض النظر عمّا إذا كان الجانب الذي يبلغ 600 وحدة بكسل مستقل الكثافة هو الارتفاع أو العرض الذي يراه المستخدم. يمكن أن يتغير أصغر عرض إذا تم تغيير حجم النافذة، ما يؤدي إلى تغيير العرض/الارتفاع المتاحَين، أو إذا تم تغيير موضعها، ما قد يؤدي إلى تغيير الحواف الداخلية للنظام.

ويُعد استخدام أصغر عرض لتحديد حجم الشاشة العام أمرًا مفيدًا لأنّ العرض غالبًا ما يكون هو العامل الأساسي في تصميم التخطيط. غالبًا ما يتم التمرير عموديًا في واجهة المستخدم، ولكن هناك قيود صارمة إلى حد ما على الحد الأدنى للمساحة التي تحتاجها أفقيًا.

ويُعد العرض المتاح أيضًا عاملاً أساسيًا في تحديد ما إذا كان سيتم استخدام تصميم ذي لوحة واحدة للهواتف الجوّالة أو تصميم متعدد اللوحات للأجهزة اللوحية. وبالتالي، من المرجّح أن يهمّك أكثر معرفة أصغر عرض ممكن على كل جهاز.

يأخذ أصغر عرض للجهاز في الاعتبار زخارف الشاشة وواجهة مستخدم النظام. على سبيل المثال، إذا كان الجهاز يتضمّن عناصر واجهة مستخدم ثابتة على الشاشة تشغل مساحة على طول محور العرض الأصغر، سيحدّد النظام أنّ العرض الأصغر أقل من حجم الشاشة الفعلي، لأنّ هذه العناصر هي وحدات بكسل على الشاشة غير متاحة لواجهة المستخدم.

في ما يلي بعض القيم التي يمكنك استخدامها هنا لأحجام الشاشات الشائعة:

  • ‫320، للأجهزة التي تتضمّن إعدادات شاشة مثل:
    • 240x320 ldpi (هاتف QVGA)
    • ‫320×480 mdpi (هاتف)
    • ‫480×800 نقطة عالية لكل بوصة (HDPI) (هاتف محمول بكثافة عالية)
  • ‫480، للشاشات مثل 480x800 mdpi (جهاز لوحي/هاتف)
  • ‫600، للشاشات مثل 600x1024 mdpi (جهاز لوحي بحجم 7 بوصات)
  • ‫720، للشاشات مثل 720x1280 mdpi (كمبيوتر لوحي بحجم 10 بوصة)

عندما يوفّر تطبيقك أدلة موارد متعددة بقيم مختلفة للمحدِّد smallestWidth، يستخدم النظام الدليل الأقرب إلى smallestWidth للجهاز (بدون تجاوزها).

تمت إضافته في مستوى واجهة برمجة التطبيقات 13.

اطّلِع أيضًا على السمة android:requiresSmallestWidthDp التي تحدّد الحد الأدنى smallestWidth الذي يتوافق معه تطبيقك، وحقل الإعداد smallestScreenWidthDp الذي يتضمّن قيمة smallestWidth للجهاز.

لمزيد من المعلومات حول تصميم الشاشات المختلفة باستخدام هذا المؤهّل، راجِع التصميم السريع الاستجابة/المتكيّف مع طرق العرض.

العرض والارتفاع المتاحان w<N>dp
h<N>dp

أمثلة:
w720dp
w1024dp
h720dp
h1024dp
إلخ

تحدّد هذه السمة الحدّ الأدنى لعرض الشاشة أو ارتفاعها المتاحَين (بوحدات dp المحدّدة بالقيمة <N>) التي يتم استخدام المرجع عندها. تتم مقارنة قيم الضبط هذه بعرض الشاشة وارتفاعها الحاليين عند تغيير اتجاه الجهاز بين الوضعَين الرأسي والأفقي، أو عند طي الجهاز أو فتحه، أو عند دخول النظام إلى وضع النوافذ المتعددة أو الخروج منه. في وضع النوافذ المتعددة، تعكس القيم عرض النافذة وارتفاعها، وليس عرض شاشة الجهاز وارتفاعها. وبالمثل، بالنسبة إلى الأنشطة المضمّنة، تتعلّق القيم بعرض الأنشطة الفردية وارتفاعها، وليس بعرض الشاشة وارتفاعها. لمزيد من المعلومات، يُرجى الاطّلاع على تضمين النشاط.

غالبًا ما يكون العرض والارتفاع المتاحان مفيدَين لتحديد ما إذا كان سيتم استخدام تصميم متعدد اللوحات، لأنّه حتى على جهاز لوحي، غالبًا ما لا تريد استخدام التصميم نفسه المتعدد اللوحات في الوضع العمودي كما هو الحال في الوضع الأفقي. وبالتالي، يمكنك استخدامها لتحديد الحد الأدنى للعرض و/أو الارتفاع المطلوبَين للتصميم، بدلاً من استخدام كلٍ من محدّدات حجم الشاشة والاتجاه معًا.

عندما يوفّر تطبيقك أدلة موارد متعددة بقيم مختلفة لعمليات الضبط هذه، يستخدم النظام الدليل الأقرب إلى عرض الشاشة الحالي للجهاز (بدون تجاوزه). يتم تحديد الأقرب إلى من خلال جمع الفروق بين عرض الشاشة الفعلي والعرض المحدّد، مع الفرق بين ارتفاع الشاشة الفعلي والارتفاع المحدّد، مع العلم أنّ الارتفاعات والعروض غير المحدّدة تكون قيمتها 0.

ولا تتضمّن القيم المساحة التي تشغلها حواف النوافذ، لذا إذا كان الجهاز يتضمّن عناصر واجهة مستخدم ثابتة على حواف الشاشة، ستكون قيم العرض والارتفاع أصغر من أبعاد الشاشة الحقيقية، حتى عندما يتم عرض التطبيق من الحافة إلى الحافة باستخدام Window.setDecorFitsSystemWindows أو WindowCompat.setDecorFitsSystemWindows.

لا يتم هنا احتساب بعض عناصر تزيين الشاشة العمودية غير الثابتة (مثل شريط حالة الهاتف الذي يمكن إخفاؤه عند عرض الشاشة بملء الشاشة)، كما لا يتم احتساب عناصر تزيين النوافذ، مثل شريط العنوان أو شريط الإجراءات، لذا يجب أن تكون التطبيقات مستعدة للتعامل مع مساحة أصغر قليلاً من تلك التي تحددها.

ملاحظة: يختار النظام المورد الذي يتطابق مع كل من العرض والارتفاع. لذلك، يُفضّل بشدة استخدام مصدر يحدّد كلا النوعين على استخدام مصدر يحدّد أحدهما فقط. على سبيل المثال، إذا كان عرض الشاشة الفعلي 720 وحدة بكسل مستقلة الكثافة وارتفاعها 1280 وحدة بكسل مستقلة الكثافة، وتم تحديد أحد الموارد باستخدام w720dp وتحديد مورد آخر باستخدام w700dp-h1200dp، سيتم اختيار المورد الأخير على الرغم من أنّ المورد الأول يطابق تمامًا ما يحدده.

تمت إضافته في مستوى واجهة برمجة التطبيقات 13.

اطّلِع أيضًا على حقلَي الإعداد screenWidthDp وscreenHeightDp اللذين يتضمّنان عرض الشاشة وارتفاعها الحاليَين.

لمزيد من المعلومات حول تصميم التطبيقات للشاشات المختلفة باستخدام هذا المؤهّل، راجِع التصميم السريع الاستجابة/التصميم المتكيّف مع طرق العرض.

حجم الشاشة small
normal
large
xlarge
  • small: الشاشات التي يكون حجمها مشابهًا لحجم شاشة QVGA منخفضة الكثافة. يبلغ الحد الأدنى لحجم التصميم على الشاشة الصغيرة 320×426 وحدة بكسل مستقلة الكثافة تقريبًا. وتشمل الأمثلة QVGA منخفضة الكثافة وVGA عالية الكثافة.
  • normal: الشاشات التي لها حجم مشابه لحجم شاشة HVGA متوسطة الكثافة يبلغ الحد الأدنى لحجم التصميم للشاشة العادية 320×470 وحدة بكسل مستقلة الكثافة تقريبًا. وتتضمّن أمثلة هذه الشاشات شاشة WQVGA منخفضة الكثافة وشاشة HVGA متوسطة الكثافة وشاشة WVGA عالية الكثافة.
  • large: الشاشات التي يكون حجمها مشابهًا لشاشة VGA متوسطة الكثافة. يبلغ الحد الأدنى لحجم التصميم على الشاشة الكبيرة 480 × 640 وحدة بكسل مستقلة الكثافة تقريبًا. وتشمل الأمثلة شاشات VGA وWVGA ذات الكثافة المتوسطة.
  • xlarge: الشاشات الأكبر حجمًا من شاشة HVGA التقليدية ذات الكثافة المتوسطة. الحد الأدنى لحجم التصميم لشاشة كبيرة جدًا هو 720 × 960 وحدة بكسل مستقلة الكثافة تقريبًا. في معظم الحالات، تكون الأجهزة ذات الشاشات الكبيرة جدًا أكبر من أن يتم حملها في الجيب، ومن المرجّح أن تكون أجهزة لوحية. تمت إضافتها في مستوى واجهة برمجة التطبيقات 9.

ملاحظة: لا يعني استخدام أداة تحديد الحجم أنّ الموارد مخصّصة فقط للشاشات بهذا الحجم. إذا لم توفّر موارد بديلة تتضمّن مؤهلات تتطابق بشكل أفضل مع إعدادات الجهاز الحالية، يمكن للنظام استخدام أي موارد تمثّل أفضل تطابق.

تنبيه: إذا كانت جميع مواردك تستخدم مؤهِّل حجم أكبر من حجم الشاشة الحالي، لن يستخدمها النظام وسيتعطّل تطبيقك أثناء وقت التشغيل. يحدث ذلك، على سبيل المثال، إذا تم وضع علامة xlarge على جميع موارد التنسيق، ولكن الجهاز يحتوي على شاشة عادية الحجم.

تمت إضافته في مستوى واجهة برمجة التطبيقات 4.

اطّلِع أيضًا على حقل الإعداد screenLayout، الذي يشير إلى ما إذا كانت الشاشة صغيرة أو عادية أو كبيرة.

لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة حول توافق الشاشة.

نسبة عرض إلى ارتفاع الشاشة long
notlong
  • long: الشاشات الطويلة، مثل WQVGA وWVGA وFWVGA
  • notlong: الشاشات غير الطويلة، مثل QVGA وHVGA وVGA

تمت إضافته في مستوى واجهة برمجة التطبيقات 4.

ويستند ذلك إلى نسبة العرض إلى الارتفاع في الشاشة (الشاشة ذات نسبة العرض إلى الارتفاع long تكون أعرض). لا يرتبط هذا الإعداد باتجاه الشاشة.

اطّلِع أيضًا على حقل الإعداد screenLayout، الذي يشير إلى ما إذا كانت الشاشة طويلة.

شاشة دائرية round
notround
  • round: الشاشات الدائرية، مثل الأجهزة القابلة للارتداء الدائرية
  • notround: الشاشات المستطيلة، مثل الهواتف أو الأجهزة اللوحية

تمت إضافته في المستوى 23 من واجهة برمجة التطبيقات.

راجِع أيضًا طريقة الإعداد isScreenRound() التي تشير إلى ما إذا كانت الشاشة دائرية.

Wide Color Gamut widecg
nowidecg
  • widecg: شاشات عرض ذات نطاق ألوان واسع، مثل Display P3 أو AdobeRGB
  • nowidecg: شاشات ذات نطاق ألوان محدود، مثل sRGB

تمت إضافته في مستوى واجهة برمجة التطبيقات 26.

راجِع أيضًا طريقة الضبط isScreenWideColorGamut()، التي تشير إلى ما إذا كانت الشاشة تتضمّن نطاقًا واسعًا من الألوان.

نطاق عالي الديناميكية (HDR) highdr
lowdr
  • highdr: شاشات بنطاق عالي الديناميكية
  • lowdr: شاشات بنطاق ديناميكي منخفض/عادي

تمت إضافته في مستوى واجهة برمجة التطبيقات 26.

راجِع أيضًا طريقة الإعداد isScreenHdr() التي توضّح ما إذا كانت الشاشة تتوافق مع تقنية HDR.

اتجاه الشاشة port
land
  • port: الجهاز في الوضع العمودي
  • land: الجهاز في الوضع الأفقي

ويمكن أن يتغيّر ذلك أثناء استخدام تطبيقك إذا قام المستخدم بتدوير الشاشة. للحصول على معلومات حول كيفية تأثير ذلك في تطبيقك أثناء وقت التشغيل، راجِع مقالة التعامل مع تغييرات الإعدادات.

اطّلِع أيضًا على حقل الإعداد orientation الذي يشير إلى اتجاه الجهاز الحالي.

وضع واجهة المستخدم car
desk
television
appliance
watch
vrheadset
  • car: يتم عرض الجهاز في قاعدة إرساء السيارة
  • desk: يتم عرض الجهاز في قاعدة شحن على المكتب
  • television: يشير إلى أنّ الجهاز يعرض المحتوى على تلفزيون، ما يوفّر تجربة "من مسافة بعيدة" حيث تظهر واجهة المستخدم على شاشة كبيرة ويبتعد المستخدم عنها، وتكون التجربة موجّهة بشكل أساسي نحو لوحة المفاتيح الاتجاهية أو التفاعل غير المستند إلى المؤشر
  • appliance: الجهاز يعمل كأداة منزلية بدون شاشة
  • watch: الجهاز مزوّد بشاشة ويتم ارتداؤه على المعصم
  • vrheadset: يعرض الجهاز المحتوى في سماعة رأس مزوّدة بتقنية الواقع الافتراضي

تمت إضافتها في المستوى 8 من واجهة برمجة التطبيقات، وتمت إضافة التلفزيون في المستوى 13 من واجهة برمجة التطبيقات، وتمت إضافة الساعة في المستوى 20 من واجهة برمجة التطبيقات.

للحصول على معلومات حول كيفية استجابة تطبيقك عند إدخال الجهاز في قاعدة شحن أو إزالته منها، يُرجى الاطّلاع على تحديد حالة قاعدة الشحن ونوعها ومراقبتها.

ويمكن أن يتغيّر ذلك أثناء استخدام تطبيقك إذا وضع المستخدم الجهاز في قاعدة شحن. يمكنك تفعيل بعض هذه الأوضاع أو إيقافها باستخدام UiModeManager. للحصول على معلومات حول كيفية تأثير ذلك في تطبيقك أثناء وقت التشغيل، راجِع مقالة التعامل مع تغييرات الإعدادات.

الوضع الليلي night
notnight
  • night: وقت الليل
  • notnight: وقت النهار

تمت إضافته في مستوى واجهة برمجة التطبيقات 8.

يمكن أن يتغير هذا الإعداد خلال فترة استخدام تطبيقك إذا تم ترك الوضع الليلي في الوضع التلقائي (الإعداد التلقائي)، وفي هذه الحالة يتغير الوضع استنادًا إلى الوقت من اليوم. يمكنك تفعيل هذا الوضع أو إيقافه باستخدام UiModeManager. للحصول على معلومات حول كيفية تأثير ذلك في تطبيقك أثناء وقت التشغيل، راجِع مقالة التعامل مع تغييرات الإعدادات.

كثافة البكسل على الشاشة (نقطة لكل بوصة) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
  • ldpi: شاشات بدقة منخفضة، تبلغ حوالي 120 نقطة لكل بوصة.
  • mdpi: شاشات متوسطة الكثافة (على شاشات HVGA التقليدية)؛ حوالي 160 نقطة لكل بوصة.
  • hdpi: شاشات عالية الكثافة؛ حوالي 240 نقطة لكل بوصة
  • xhdpi: شاشات عالية الكثافة جدًا؛ حوالي 320 نقطة لكل بوصة تمت إضافتها في المستوى 8 من واجهة برمجة التطبيقات.
  • xxhdpi: شاشات عالية الكثافة للغاية، تبلغ دقتها حوالي 480 نقطة لكل بوصة. تمت إضافتها في المستوى 16 من واجهة برمجة التطبيقات.
  • xxxhdpi: يتم استخدامها في الكثافة العالية جدًا جدًا جدًا (رمز مشغّل التطبيقات فقط، راجِع توافُق التطبيق مع كثافات البكسل المختلفة)؛ تبلغ حوالي 640 نقطة لكل بوصة. تمت إضافته في مستوى واجهة برمجة التطبيقات 18.
  • nodpi: تُستخدَم لموارد الصور النقطية التي لا تريد تغيير حجمها لتتطابق مع كثافة الشاشة على الجهاز.
  • tvdpi: شاشات تقع في مكان ما بين mdpi وhdpi، أي حوالي 213 نقطة لكل بوصة. لا تُعدّ هذه المجموعة مجموعة كثافة "أساسية". وهي مخصّصة في الغالب لأجهزة التلفزيون بدقة 720p، ولا تحتاج إليها معظم التطبيقات. بالنسبة إلى لوحات التلفزيون بدقة 1080p، استخدِم xhdpi، وبالنسبة إلى لوحات التلفزيون بدقة 4K، استخدِم xxxhdpi. تمت إضافته في مستوى واجهة برمجة التطبيقات 13.
  • anydpi: تطابق جميع قيم كثافة الشاشة ولها الأولوية على المؤهلات الأخرى. ويفيد ذلك في الرسومات المتجهة القابلة للرسم. تمت إضافته في مستوى واجهة برمجة التطبيقات 21.
  • nnndpi: تُستخدَم لتمثيل الكثافات غير العادية، حيث يمثّل nnn عددًا صحيحًا موجبًا لكثافة الشاشة. لا يتم استخدام هذا الإجراء في معظم الحالات. يؤدي استخدام حِزم الكثافة العادية إلى تقليل النفقات العامة اللازمة لتوفير التوافق مع كثافات شاشات الأجهزة المختلفة المتوفرة في السوق.

هناك نسبة تحجيم 3:4:6:8:12:16 بين الكثافات الست الأساسية (مع تجاهل كثافة tvdpi). وبالتالي، فإنّ صورة نقطية بحجم 9×9 في ldpi تكون بحجم 12×12 في mdpi، و18×18 في hdpi، و24×24 في xhdpi، وهكذا.

ملاحظة: لا يعني استخدام معرّف الكثافة أنّ الموارد مخصّصة فقط للشاشات ذات الكثافة المحدّدة. إذا لم توفِّر موارد بديلة تتضمّن مؤهِّلات تتوافق بشكل أفضل مع إعدادات الجهاز الحالية، سيستخدم النظام الموارد التي تمثّل أفضل تطابق.

لمزيد من المعلومات حول كيفية التعامل مع كثافات الشاشة المختلفة وكيفية تغيير Android لحجم الصور النقطية لتلائم الكثافة الحالية، راجِع نظرة عامة حول توافق الشاشة.

نوع شاشة اللمس notouch
finger
  • notouch: الجهاز لا يتضمّن شاشة تعمل باللمس.
  • finger: الجهاز مزوّد بشاشة تعمل باللمس ومصمَّمة للاستخدام من خلال التفاعل المباشر بإصبع المستخدم.

يمكنك أيضًا الاطّلاع على حقل الإعداد touchscreen، الذي يشير إلى نوع شاشة اللمس على الجهاز.

مدى توفّر لوحة المفاتيح keysexposed
keyshidden
keyssoft
  • keysexposed: يتوفّر للجهاز لوحة مفاتيح. إذا كانت لوحة المفاتيح الافتراضية مفعّلة على الجهاز (وهو أمر محتمل)، سيتم استخدامها حتى عندما لا تظهر لوحة المفاتيح الخارجية للمستخدم أو عندما لا يتضمّن الجهاز لوحة مفاتيح خارجية. في حال عدم توفّر لوحة مفاتيح برامج أو إيقافها، لن يتم استخدام هذا الإعداد إلا عند توفّر لوحة مفاتيح خارجية.
  • keyshidden: يتوفّر للجهاز لوحة مفاتيح خارجية ولكنها مخفية و لا تتوفّر لوحة مفاتيح افتراضية على الجهاز.
  • keyssoft: الجهاز مزوّد بلوحة مفاتيح افتراضية مفعَّلة، سواء كانت مرئية أم لا.

إذا قدّمت موارد keysexposed، ولكن ليس موارد keyssoft، سيستخدم النظام موارد keysexposed بغض النظر عمّا إذا كانت لوحة المفاتيح مرئية، طالما أنّ لوحة المفاتيح الافتراضية مفعّلة في النظام.

يمكن أن يتغيّر ذلك أثناء استخدام تطبيقك إذا فتح المستخدم لوحة مفاتيح خارجية. للحصول على معلومات حول كيفية تأثير ذلك في تطبيقك أثناء وقت التشغيل، راجِع مقالة التعامل مع تغييرات الإعدادات.

اطّلِع أيضًا على حقلَي الإعداد hardKeyboardHidden وkeyboardHidden اللذين يشيران إلى إمكانية ظهور لوحة مفاتيح خارجية وإمكانية ظهور أي نوع من لوحات المفاتيح (بما في ذلك لوحة المفاتيح البرمجية)، على التوالي.

طريقة إدخال النص الأساسية nokeys
qwerty
12key
  • nokeys: الجهاز لا يتضمّن مفاتيح أجهزة لإدخال النص.
  • qwerty: يشير إلى أنّ الجهاز يتضمّن لوحة مفاتيح QWERTY مادية، سواء كانت مرئية للمستخدم أم لا.
  • 12key: يشير إلى أنّ الجهاز يتضمّن لوحة مفاتيح مكوّنة من 12 مفتاحًا، سواء كانت مرئية للمستخدم أم لا.

راجِع أيضًا حقل الإعداد keyboard الذي يشير إلى طريقة إدخال النص الأساسية المتاحة.

إصدار النظام الأساسي (مستوى واجهة برمجة التطبيقات) أمثلة:
v3
v4
v7
إلخ

مستوى واجهة برمجة التطبيقات المتوافق مع الجهاز على سبيل المثال، v1 لمستوى واجهة برمجة التطبيقات 1 (الأجهزة التي تعمل بالإصدار 1.0 من نظام التشغيل Android أو الإصدارات الأحدث) وv4 لمستوى واجهة برمجة التطبيقات 4 (الأجهزة التي تعمل بالإصدار 1.6 من نظام التشغيل Android أو الإصدارات الأحدث). لمزيد من المعلومات حول هذه القيم، يُرجى الاطّلاع على مستند مستويات واجهة برمجة التطبيقات في Android.

ملاحظة: لا تتوافق بعض إصدارات Android مع جميع المؤهّلات. يؤدي استخدام مؤهِّل جديد ضمنيًا إلى إضافة مؤهِّل إصدار النظام الأساسي حتى تتمكّن الأجهزة القديمة من تجاهله. على سبيل المثال، يؤدي استخدام المحدِّد w600dp إلى تضمين المحدِّد v13 تلقائيًا، لأنّ المحدِّد available-width كان جديدًا في مستوى واجهة برمجة التطبيقات 13. لتجنُّب حدوث أي مشاكل، عليك دائمًا تضمين مجموعة من الموارد التلقائية (مجموعة من الموارد بدون مؤهلات). لمزيد من المعلومات، راجِع القسم حول توفير أفضل توافق للأجهزة مع الموارد.

قواعد اسم المؤهّل

في ما يلي بعض القواعد المتعلّقة باستخدام أسماء مؤهِّلات الإعدادات:

  • يمكنك تحديد مؤهلات متعددة لمجموعة واحدة من الموارد، مع الفصل بينها بشرطات. على سبيل المثال، ينطبق drawable-en-rUS-land على الأجهزة التي تستخدم اللغة الإنجليزية الأمريكية في الوضع الأفقي.
  • يجب أن تكون المؤهلات بالترتيب الوارد في الجدول 2.
    • غير صحيح: drawable-hdpi-port/
    • صحيح: drawable-port-hdpi/
  • لا يمكن أن تكون أدلة الموارد البديلة متداخلة. على سبيل المثال، لا يمكنك استخدام res/drawable/drawable-en/.
  • هذه القيم غير حساسة لحالة الأحرف. يحوّل برنامج تجميع الموارد أسماء الدلائل إلى أحرف صغيرة قبل المعالجة لتجنُّب حدوث مشاكل في أنظمة الملفات غير الحساسة لحالة الأحرف. يتم استخدام الأحرف الكبيرة في الأسماء فقط لتسهيل القراءة.
  • يمكن استخدام قيمة واحدة فقط لكل نوع من أنواع المؤهلات. على سبيل المثال، إذا أردت استخدام ملفات الرسومات القابلة للرسم نفسها لإسبانيا وفرنسا، لا يمكنك إنشاء دليل باسم drawable-es-fr/. بدلاً من ذلك، تحتاج إلى دليلَين للموارد، مثل drawable-es/ وdrawable-fr/، يحتويان على الملفات المناسبة. ومع ذلك، ليس مطلوبًا منك تكرار الملفات في كلا الموقعَين. بدلاً من ذلك، يمكنك إنشاء اسم مستعار لمورد، كما هو موضّح في قسم إنشاء موارد بأسماء مستعارة.

بعد حفظ الموارد البديلة في أدلة تحمل أسماء المؤهلات هذه، يطبِّق نظام التشغيل Android تلقائيًا الموارد في تطبيقك استنادًا إلى إعدادات الجهاز الحالية. في كل مرة يتم فيها طلب مورد، يبحث نظام التشغيل Android عن أدلة موارد بديلة تحتوي على ملف المورد المطلوب، ثم يعثر على المورد الأنسب.

إذا لم تتوفّر موارد بديلة تتطابق مع إعدادات جهاز معيّن، يستخدم نظام التشغيل Android الموارد التلقائية المناسبة، أي مجموعة الموارد الخاصة بنوع معيّن من الموارد التي لا تتضمّن محدّدًا لإعدادات الجهاز.

إنشاء موارد الأسماء المستعارة

عندما يكون لديك مورد تريد استخدامه في أكثر من إعداد واحد للجهاز، ولكنك لا تريد توفيره كمورد تلقائي، لن تحتاج إلى وضع المورد نفسه في أكثر من دليل واحد للموارد البديلة. بدلاً من ذلك، يمكنك إنشاء مورد بديل يعمل كاسم مستعار لمورد محفوظ في دليل الموارد التلقائي.

ملاحظة: لا توفّر بعض المراجع آلية تتيح لك إنشاء اسم مستعار لمرجع آخر. على وجه الخصوص، لا تتوفّر هذه الميزة للموارد غير المحدّدة، مثل الصور المتحركة والقوائم والبيانات الأولية وغيرها من الموارد في الدليل xml/.

على سبيل المثال، لنفترض أنّ لديك رمز تطبيق، icon.png، وتحتاج إلى نسخة فريدة منه للغات مختلفة. ومع ذلك، يجب أن يستخدم كلا الموقعَين، الإنجليزي الكندي والفرنسي الكندي، الإصدار نفسه. ليس عليك نسخ الصورة نفسها إلى دليل الموارد لكل من اللغة الإنجليزية الكندية والفرنسية الكندية. بدلاً من ذلك، يمكنك حفظ الصورة المستخدَمة لكليهما بأي اسم غير icon.png، مثل icon_ca.png، ووضعها في دليل res/drawable/ التلقائي. بعد ذلك، أنشِئ ملف icon.xml في res/drawable-en-rCA/ وres/drawable-fr-rCA/ يشير إلى المرجع icon_ca.png باستخدام العنصر <bitmap>. يتيح لك ذلك تخزين نسخة واحدة فقط من ملف PNG وملفَّين صغيرَين بتنسيق XML يشيران إليها. يُرجى الاطّلاع على الأمثلة في الأقسام التالية لمعرفة التفاصيل.

عنصر قابل للرسم

لإنشاء اسم مستعار لعنصر قابل للرسم حالي، استخدِم العنصر <drawable>:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="icon">@drawable/icon_ca</drawable>
</resources>

إذا حفظت هذا الملف بتنسيق icon.xml في دليل موارد بديل، مثل res/values-en-rCA/، سيتم تجميعه في مورد يمكنك الرجوع إليه باسم R.drawable.icon، ولكنّه في الواقع اسم مستعار للمورد R.drawable.icon_ca المحفوظ في res/drawable/.

التنسيق

لإنشاء اسم مستعار لتصميم حالي، استخدِم العنصر <include> المضمّن في <merge>:

<?xml version="1.0" encoding="utf-8"?>
<merge>
    <include layout="@layout/main_ltr"/>
</merge>

إذا حفظت هذا الملف باسم main.xml، سيتم تجميعه في مورد يمكنك الرجوع إليه باسم R.layout.main، ولكنّه في الواقع اسم مستعار للمورد R.layout.main_ltr.

السلاسل والقيم البسيطة الأخرى

لإنشاء اسم مستعار لسلسلة حالية، استخدِم معرّف المورد للسلسلة المطلوبة كقيمة للسلسلة الجديدة:

<?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 وlayout. لمزيد من المعلومات حول الأنواع المختلفة، اطّلِع على نظرة عامة على أنواع الموارد.
  • اسم المورد، وهو إما اسم الملف بدون الامتداد أو القيمة في السمة android:name في ملف XML، إذا كان المورد قيمة بسيطة، مثل سلسلة

هناك طريقتان للوصول إلى مرجع:

  • في الرمز البرمجي: استخدام عدد صحيح ثابت من فئة فرعية من فئة R، مثل:
    R.string.hello

    string هو نوع المرجع وhello هو اسم المرجع. هناك العديد من واجهات برمجة التطبيقات لنظام Android التي يمكنها الوصول إلى مواردك عند تقديم رقم تعريف مرجعي بهذا التنسيق. لمزيد من المعلومات، راجِع قسم الوصول إلى الموارد في الرمز.

  • في XML: استخدام بنية XML خاصة تتوافق مع معرّف المورد المحدّد في فئة R، مثل:
    @string/hello

    string هو نوع المرجع وhello هو اسم المرجع. يمكنك استخدام هذه الصيغة في أي مصدر XML في أي مكان يُتوقّع فيه توفير قيمة في مصدر. لمزيد من المعلومات، يُرجى الاطّلاع على القسم الوصول إلى الموارد من XML.

الوصول إلى المراجع في الرمز

يمكنك استخدام مورد في الرمز البرمجي من خلال تمرير معرّف المورد كمعلَمة طريقة. على سبيل المثال، يمكنك ضبط ImageView لاستخدام المرجع res/drawable/myimage.png باستخدام setImageResource():

Kotlin

val imageView = findViewById(R.id.myimageview) as ImageView
imageView.setImageResource(R.drawable.myimage)

Java

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

يمكنك أيضًا استرداد موارد فردية باستخدام طرق في Resources، والتي يمكنك الحصول على مثيل لها باستخدام getResources().

بناء الجملة

في ما يلي بنية الإشارة إلى أحد الموارد في الرمز البرمجي:

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name> هو اسم الحزمة التي يقع فيها المورد (ليس مطلوبًا عند الإشارة إلى موارد من الحزمة الخاصة بك).
  • <resource_type> هي الفئة الفرعية R لنوع المورد.
  • <resource_name> هو إما اسم ملف المورد بدون الإضافة أو قيمة السمة android:name في عنصر XML، وذلك للقيم البسيطة.

لمزيد من المعلومات حول كل نوع من أنواع الموارد وكيفية الإشارة إليها، يُرجى الاطّلاع على نظرة عامة على أنواع الموارد.

حالات الاستخدام

هناك العديد من الطرق التي تقبل مَعلمة رقم تعريف المورد، ويمكنك استرداد الموارد باستخدام الطرق في Resources. يمكنك الحصول على مثيل من Resources باستخدام Context.getResources().

في ما يلي بعض الأمثلة على الوصول إلى الموارد في الرمز البرمجي:

Kotlin

// Load a background for the current screen from a drawable resource.
window.setBackgroundDrawableResource(R.drawable.my_background_image)

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
window.setTitle(resources.getText(R.string.main_title))

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen)

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in))

// Set the text on a TextView object using a resource ID.
val msgTextView = findViewById(R.id.msg) as TextView
msgTextView.setText(R.string.hello_message)

Java

// Load a background for the current screen from a drawable resource.
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID.
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

تنبيه: لا تعدِّل ملف R.java يدويًا. يتم إنشاؤه بواسطة أداة aapt عند تجميع مشروعك. سيتم تجاهل أي تغييرات في المرة التالية التي يتم فيها التجميع.

الوصول إلى الموارد من XML

يمكنك تحديد قيم لبعض سمات XML وعناصرها باستخدام مرجع إلى مورد حالي. ويتم ذلك غالبًا عند إنشاء ملفات التنسيق لتوفير السلاسل والصور للتطبيقات المصغّرة.

على سبيل المثال، إذا أضفت Button إلى التصميم، استخدِم مصدر السلاسل النصية لنص الزر:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

بناء الجملة

في ما يلي صيغة الإشارة إلى مرجع في مورد XML:

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name> هو اسم الحزمة التي يقع فيها المورد (ليس مطلوبًا عند الإشارة إلى موارد من الحزمة نفسها).
  • <resource_type> هو الفئة الفرعية R لنوع المورد.
  • <resource_name> هو إما اسم ملف المورد بدون الامتداد أو قيمة السمة android:name في عنصر XML، وذلك للقيم البسيطة.

لمزيد من المعلومات حول كل نوع من أنواع الموارد وكيفية الإشارة إليها، يُرجى الاطّلاع على نظرة عامة على أنواع الموارد.

حالات الاستخدام

في بعض الحالات، يجب استخدام مرجع لقيمة في XML، مثل تطبيق صورة قابلة للرسم على عنصر واجهة مستخدم، ولكن يمكنك أيضًا استخدام مرجع في 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" />

في هذه الحالة، لا تحتاج إلى تحديد اسم الحزمة في مرجع المورد، لأنّ الموارد من حزمتك الخاصة. للإشارة إلى أحد موارد النظام، عليك تضمين اسم الحزمة، كما هو موضّح في المثال التالي:

<?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="@android:color/secondary_text_dark"
    android:text="@string/hello" />

ملاحظة: استخدِم دائمًا موارد السلسلة، حتى يمكن ترجمة تطبيقك إلى لغات أخرى. للحصول على معلومات حول إنشاء موارد بديلة (مثل السلاسل المترجمة)، يُرجى الاطّلاع على توفير موارد بديلة. للحصول على دليل كامل حول أقلمة تطبيقك ليناسب لغات أخرى، يُرجى الاطّلاع على مقالة أقلمة تطبيقك.

يمكنك حتى استخدام الموارد بتنسيق XML لإنشاء أسماء مستعارة. على سبيل المثال، يمكنك إنشاء مورد قابل للرسم يكون اسمًا مستعارًا لمورد آخر قابل للرسم:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

قد يبدو هذا الإجراء غير ضروري، ولكنّه قد يكون مفيدًا جدًا عند استخدام مصدر بديل. لمزيد من المعلومات، راجِع القسم حول إنشاء موارد أسماء مستعارة.

سمات نمط المرجع

يتيح لك مورد سمة النمط الرجوع إلى قيمة سمة في المظهر المطبَّق حاليًا. تتيح لك الإشارة إلى سمة نمط تخصيص مظهر عناصر واجهة المستخدم من خلال تصميمها لتتطابق مع الأشكال المتغيرة العادية التي يوفّرها المظهر الحالي، بدلاً من توفير قيمة مبرمَجة. تشير الإشارة إلى سمة نمط بشكل أساسي إلى "استخدام النمط الذي تحدّده هذه السمة في المظهر الحالي".

للإشارة إلى سمة نمط، تكون بنية الاسم مطابقة تقريبًا لتنسيق المورد العادي، ولكن بدلاً من رمز "@" (@)، استخدِم علامة استفهام (?). جزء نوع المورد اختياري. وبالتالي، تكون بنية المرجع على النحو التالي:

?[<package_name>:][<resource_type>/]<resource_name>

على سبيل المثال، إليك كيفية الإشارة إلى سمة لضبط لون النص ليتطابق مع لون النص الثانوي لمظهر النظام:

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

في هذا المثال، تحدّد السمة android:textColor اسم سمة نمط في التصميم الحالي. يستخدم Android الآن القيمة المطبَّقة على السمة android:textColorSecondary style كقيمة android:textColor في هذه الأداة. بما أنّ أداة موارد النظام تعرف أنّه من المتوقّع توفّر مورد سمة في هذا السياق، ليس عليك تحديد النوع بشكل صريح، وهو ?android:attr/textColorSecondary. يمكنك استبعاد النوع attr.

الوصول إلى الملفات الأصلية

على الرغم من أنّ هذا الإجراء غير شائع، قد تحتاج إلى الوصول إلى ملفاتك وأدلتك الأصلية. في هذه الحالة، لن تتمكّن من حفظ ملفاتك في res/، لأنّ الطريقة الوحيدة لقراءة مورد من res/ هي استخدام معرّف المورد. يمكنك بدلاً من ذلك حفظ الموارد في الدليل assets/.

لا يتم منح الملفات المحفوظة في الدليل assets/ معرّف موارد، لذا لا يمكنك الرجوع إليها من خلال الفئة R أو من موارد XML. بدلاً من ذلك، يمكنك طلب البحث عن الملفات في الدليل assets/ كما تفعل في نظام الملفات العادي وقراءة البيانات الأولية باستخدام AssetManager.

ومع ذلك، إذا كان كل ما تحتاجه هو إمكانية قراءة البيانات الأولية (مثل ملف فيديو أو ملف صوتي)، فاحفظ الملف في الدليل res/raw/ واقرأ مجموعة من البايتات باستخدام openRawResource().

الوصول إلى مراجع المنصة

يحتوي نظام التشغيل Android على عدد من الموارد العادية، مثل الأنماط والمظاهر والتصاميم. للوصول إلى هذه الموارد، يجب تحديد مرجع المورد باستخدام اسم حزمة android. على سبيل المثال، يوفّر نظام التشغيل Android مورد تصميم يمكنك استخدامه لعناصر القائمة في ListAdapter:

Kotlin

listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)

Java

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

في هذا المثال، simple_list_item_1 هو مورد التصميم تحدده المنصة لعناصر في ListView. يمكنك استخدام هذا الخيار بدلاً من إنشاء تصميم خاص بك لعناصر القائمة.

توفير أفضل توافق للأجهزة مع الموارد

لكي يتوافق تطبيقك مع إعدادات أجهزة متعددة، من المهم جدًا أن توفّر دائمًا موارد تلقائية لكل نوع من الموارد التي يستخدمها تطبيقك.

على سبيل المثال، إذا كان تطبيقك يتيح استخدام عدة لغات، عليك دائمًا تضمين دليل values/ (يتم فيه حفظ السلاسل) بدون محدد اللغة والمنطقة. إذا وضعت جميع ملفات السلاسل في أدلة تتضمّن مؤهّلاً للغة والمنطقة، سيتعطّل تطبيقك عند تشغيله على جهاز مضبوط على لغة لا تتوافق مع السلاسل.

طالما أنّك توفّر موارد values/تلقائية، سيعمل تطبيقك بشكل سليم، حتى إذا لم يفهم المستخدم اللغة التي يعرضها. هذا أفضل من تعذُّر تشغيل التطبيق.

وبالمثل، إذا قدّمت موارد تنسيق مختلفة استنادًا إلى اتجاه الشاشة، اختَر أحد الاتجاهات ليكون هو الاتجاه التلقائي. على سبيل المثال، بدلاً من توفير موارد التنسيق في layout-land/ للوضع الأفقي وlayout-port/ للوضع العمودي، اترك أحد الموضعين كوضع تلقائي، مثل layout/ للوضع الأفقي وlayout-port/ للوضع العمودي.

إنّ توفير موارد تلقائية أمر مهم، ليس فقط لأنّ تطبيقك قد يعمل على إعدادات لم تتوقّعها، ولكن أيضًا لأنّ الإصدارات الجديدة من Android تضيف أحيانًا محدّدات إعدادات لا تتوافق مع الإصدارات القديمة. إذا كنت تستخدم مؤهِّل موارد جديدًا، ولكنك تحافظ على توافق الرمز مع الإصدارات القديمة من Android، سيتعطّل تطبيقك عند تشغيله على إصدار قديم من Android إذا لم توفّر موارد تلقائية، لأنّه لا يمكنه استخدام الموارد التي تحمل اسم مؤهِّل الموارد الجديد.

على سبيل المثال، إذا تم ضبط minSdkVersion على 4، وكنت تؤهّل جميع موارد الرسومات القابلة للرسم باستخدام الوضع الليلي (night أو notnight، اللذان تمت إضافتهما في مستوى واجهة برمجة التطبيقات 8)، لن يتمكّن الجهاز الذي يعمل بمستوى واجهة برمجة التطبيقات 4 من الوصول إلى موارد الرسومات القابلة للرسم وسيحدث عطل. في هذه الحالة، من المحتمل أنّك تريد أن تكون notnight هي الموارد التلقائية، لذا استبعِد هذا المؤهّل وضَع موارد الرسومات القابلة للرسم في drawable/ أو drawable-night/.

باختصار، لضمان أفضل توافق مع الأجهزة، عليك دائمًا توفير موارد تلقائية للموارد التي يحتاجها تطبيقك ليعمل بشكل سليم. بعد ذلك، أنشئ موارد بديلة لإعدادات أجهزة معيّنة باستخدام محدّدات الإعدادات.

هناك استثناء واحد لهذه القاعدة: إذا كان minSdkVersion لتطبيقك هو 4 أو أكثر، لن تحتاج إلى موارد رسومات قابلة للرسم تلقائية عند توفير موارد رسومات قابلة للرسم بديلة باستخدام أداة تحديد كثافة الشاشة. حتى بدون موارد رسومات قابلة للرسم تلقائية، يمكن لنظام التشغيل Android العثور على أفضل تطابق بين كثافات الشاشة البديلة وتغيير حجم الصور النقطية حسب الحاجة. ومع ذلك، للحصول على أفضل تجربة على جميع أنواع الأجهزة، يجب توفير رسومات قابلة للرسم بديلة لجميع الأنواع الثلاثة من الكثافة.

الطريقة التي يعثر بها نظام التشغيل Android على أفضل مورد مطابق

عند طلب مرجع توفّر له بدائل، يختار نظام التشغيل Android المرجع البديل الذي سيتم استخدامه في وقت التشغيل، وذلك استنادًا إلى إعدادات الجهاز الحالية. لتوضيح كيفية اختيار Android لمورد بديل، لنفترض أنّ أدلة الرسومات القابلة للرسم التالية يحتوي كل منها على إصدارات مختلفة من الصور نفسها:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

لنفترض أنّ إعدادات الجهاز هي كما يلي:

Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key

من خلال مقارنة إعدادات الجهاز بالمَراجع البديلة المتاحة، يختار نظام التشغيل Android عناصر قابلة للرسم من drawable-en-port.

يصل النظام إلى قراره بشأن الموارد التي سيستخدمها وفقًا للمنطق التالي:

الشكل 2: مخطّط انسيابي يوضّح كيف يعثر Android على المورد الأنسب

  1. إزالة ملفات الموارد التي تتعارض مع إعدادات الجهاز

    تمت إزالة الدليل drawable-fr-rCA/ لأنّه يتعارض مع اللغة en-GB.

    drawable/
    drawable-en/
    drawable-fr-rCA/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

    استثناء: كثافة وحدات البكسل على الشاشة هي المؤهّل الوحيد الذي لا يتم استبعاده بسبب التناقض. على الرغم من أنّ كثافة الشاشة على الجهاز هي hdpi، لا يتم استبعاد drawable-port-ldpi/ لأنّه يتم اعتبار كل كثافة شاشة مطابقة في هذه المرحلة. لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على توافق الشاشة.

  2. ابحث عن مؤهّل الأولوية الأعلى التالي في القائمة (الجدول 2). (ابدأ برمز فئة التجّار).
  3. هل يتضمّن أي من أدلة الموارد هذا المؤهّل؟
    • إذا كانت الإجابة "لا"، ارجع إلى الخطوة الثانية واطّلِع على المؤهّل التالي. في هذا المثال، الإجابة هي "لا" إلى أن يتم الوصول إلى مؤهّل اللغة.
    • إذا كانت الإجابة بنعم، انتقِل إلى الخطوة الرابعة.
  4. إزالة أدلة الموارد التي لا تتضمّن هذا المؤهّل في هذا المثال، سيزيل النظام بعد ذلك جميع الأدلة التي لا تتضمّن مؤهّلاً للغة:
    drawable/
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

    استثناء: إذا كان المؤهِّل المعنيّ هو كثافة وحدات البكسل على الشاشة، يختار نظام التشغيل Android الخيار الذي يتطابق بشكل كبير مع كثافة وحدات البكسل على شاشة الجهاز. بشكل عام، يفضّل نظام التشغيل Android تصغير حجم صورة أصلية أكبر من تكبير حجم صورة أصلية أصغر. لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة حول توافق الشاشة.

  5. كرِّر الخطوات اثنتين وثلاث وأربع إلى أن يتبقى دليل واحد فقط. في هذا المثال، اتجاه الشاشة هو المؤهّل التالي الذي تتوفّر له أي قيم مطابقة. وبالتالي، يتم استبعاد الموارد التي لا تحدّد اتجاه الشاشة:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    الدليل المتبقي هو drawable-en-port.

على الرغم من تنفيذ هذا الإجراء لكل مورد مطلوب، يحسّن النظام بعض جوانبه. أحد أشكال التحسين هذه هو أنّه بمجرد معرفة إعدادات الجهاز، قد يتم استبعاد الموارد البديلة التي لا يمكن أن تتطابق أبدًا. على سبيل المثال، إذا كانت لغة الإعداد هي الإنجليزية، لن يتم تضمين أي دليل موارد يحتوي على مؤهّل لغة مضبوط على لغة أخرى غير الإنجليزية في مجموعة الموارد التي يتم التحقّق منها (مع ذلك، سيظل دليل الموارد بدون مؤهّل اللغة مضمّنًا).

عند اختيار موارد استنادًا إلى مؤهلات حجم الشاشة، يستخدم النظام موارد مصمَّمة لشاشة أصغر من الشاشة الحالية إذا لم تتوفّر موارد تتطابق بشكل أفضل. على سبيل المثال، تستخدم الشاشة الكبيرة موارد الشاشة العادية إذا لزم الأمر.

ومع ذلك، إذا كانت الموارد المتاحة أكبر من الشاشة الحالية، لن يستخدمها النظام وسيتعطّل تطبيقك إذا لم تتطابق أي موارد أخرى مع إعدادات الجهاز. يحدث ذلك، على سبيل المثال، إذا تم وضع علامة xlarge على جميع موارد التنسيق، ولكن الجهاز يحتوي على شاشة عادية الحجم.

ملاحظة: إنّ أسبقية المؤهِّل (في الجدول 2) أكثر أهمية من عدد المؤهّلات التي تتطابق تمامًا مع الجهاز. في المثال السابق، في الخطوة الرابعة، يتضمّن الخيار الأخير في القائمة ثلاث مؤهلات تطابق الجهاز تمامًا (الاتجاه ونوع شاشة اللمس وطريقة الإدخال)، بينما يحتوي drawable-en على مَعلمة واحدة فقط تطابق (اللغة). ومع ذلك، فإنّ اللغة لها أولوية أعلى من هذه المؤهلات الأخرى، لذا يتم استبعاد drawable-port-notouch-12key.