الموارد: النصوص والألوان والأبعاد
الموارد: النصوص والألوان والأبعاد
من أبرز القرارات المعمارية في نظام Android فصل القيم عن الكود فصلاً تامًا. الألوان والنصوص والأحجام والصور — لا شيء من هذا يصح وضعه مُضمَّنًا داخل فئة Java. إنها تقيم في ملفات XML للموارد تحت مجلد res/، ويولّد نظام البناء فئةً اسمها R تمنح كودك معرّفات صحيحة النوع (type-safe integer handles) لكل مورد. يتناول هذا الدرس أنواع موارد القيم الثلاثة الأساسية — النصوص والألوان والأبعاد — ويشرح كيفية استخدامها بشكل صحيح على كل مستوى من مستويات التطبيق.
لماذا نُخرج القيم إلى موارد خارجية؟
تخيّل أنك وضعت لونًا مضمَّنًا مباشرةً في Java:
الآن تخيّل أن المصمم غيّر اللون الرئيسي للعلامة التجارية. عليك البحث في كل ملف Java، وإيجاد كل قيمة سداسية حرفية، وأن تأمل أنك لم تفتك أيٌّ منها. وإذا أضفت دعم اللغة العربية لاحقًا، فإن كل نص مضمَّن يصبح عبئًا على الصيانة.
مع ملفات الموارد تغيّر سطرًا واحدًا في colors.xml فيتحدث كل عنصر واجهة يشير إلى @color/brand_primary تلقائيًا — في كل التخطيطات وكل السمات وكل كثافات الشاشة وكل اللغات.
بنية مجلد res/
ينظّم Android الموارد في مجلدات فرعية مُصنَّفة داخل app/src/main/res/:
res/values/strings.xml— ثوابت النصوص والجمعres/values/colors.xml— ثوابت الألوانres/values/dimens.xml— ثوابت الأبعاد (dp, sp)res/values/styles.xml— الأنماط والسماتres/drawable/— الرسومات المتجهة والنقطيةres/layout/— ملفات التخطيط XMLres/values-ar/strings.xml— تجاوزات النصوص العربية (التوطين)res/values-night/colors.xml— تجاوزات ألوان الوضع الليلي
-ar و-night و-sw600dp. يختار محلّل موارد Android المجلد الأفضل تطابقًا وقت التشغيل. مجلدك الافتراضي values/ هو الاحتياطي عندما لا يتطابق أي مؤهّل. هذه الآلية الواحدة تتعامل مع التوطين والوضع الليلي وحجم الشاشة والكثافة والاتجاه — كل ذلك دون عبارة if واحدة في Java.
النصوص (Strings)
كل نص مرئي للمستخدم ينبغي أن يعيش في res/values/strings.xml:
للإشارة إلى نص داخل XML للتخطيط استخدم البادئة @string/:
لتحميل نص في كود Java استخدم getString() — متاحة على أي Context (Activity أو Fragment أو Service):
getString(R.string.items_count, cart.size()) يتيح للمترجمين إعادة ترتيب الجملة بصورة طبيعية في لغتهم. مع التسلسل تُلزم كل لغة بالترتيب الإنجليزي للكلمات، وهو ما قد يبدو غريبًا في العربية أو اليابانية أو الألمانية.
الجمع (Plurals)
كثير من اللغات تمتلك أكثر من صيغتَي مفرد وجمع. استخدم <plurals> للتعامل معها بشكل صحيح:
الألوان (Colors)
تنتمي الألوان إلى res/values/colors.xml كقيم سداسية بصيغة ARGB أو RGB:
استخدم الألوان في XML بالبادئة @color/:
حلّ لون في Java باستخدام ContextCompat.getColor():
getResources().getColor(int) مباشرةً. هذه الدالة أُهملت في API 23 لأنها تتجاهل السمة الحالية. استخدم دائمًا ContextCompat.getColor(context, R.color.xxx)، وهي آمنة على جميع مستويات API وتحترم السمات بشكل صحيح.
الأبعاد (Dimensions)
تُخزَّن الأبعاد في res/values/dimens.xml. ثمة وحدتان في Android يجب أن تعرفهما:
- dp (بكسل مستقل عن الكثافة) — استخدمه لجميع أحجام التخطيط (الهوامش والحشو والعروض والارتفاعات). يعادل 1 dp بكسلاً فيزيائيًا واحدًا على شاشة بكثافة 160 dpi؛ يقوم النظام بالتوسع تلقائيًا على الشاشات عالية الكثافة.
- sp (بكسل مستقل عن الحجم) — استخدمه حصرًا لأحجام النصوص. مثل dp لكنه يتوسع أيضًا مع إعداد حجم الخط في النظام لدى المستخدم. لا تضع
textSizeأبدًا بوحدة dp.
طبّق الأبعاد في XML:
اقرأ بُعدًا في Java (يُرجع بيكسلات مُعدَّلة وفق الشاشة الحالية):
الوصول إلى الموارد — الفئة R
في كل مرة تبني فيها مشروعك، يولّد ملحق Android Gradle الفئةَ R.java (أو ما يعادلها ثنائيًا). تحتوي على فئات ساكنة متداخلة — R.string وR.color وR.dimen وR.id وR.layout وغيرها — تحمل كل منها ثوابت صحيحة (integer constants) تُعيّن إلى المورد الفعلي. لا تُنشئ هذه الفئة ولا تعدّلها؛ أنت فقط تقرأ منها.
Build > Make Project. تُعاد توليد الفئة R عند كل بناء ناجح.
التوطين: توفير نصوص بديلة
لترجمة النصوص إلى العربية، أنشئ res/values-ar/strings.xml ووفّر فقط النصوص المختلفة. لا حاجة لتكرار كل نص — تجاوز فقط ما يتغير:
عندما يكون لغة الجهاز عربية، يُعيد getString(R.string.login_button) تلقائيًا "تسجيل الدخول" دون أي تغيير في الكود. هذه هي القيمة الكاملة لنظام الموارد.
الخلاصة
ملفات الموارد ليست مجرد إجراء شكلي — إنها الآلية التي تجعل تطبيقك صحيحًا على كل جهاز ولغة وسمة دون منطق تفريعي في Java. ضع جميع النصوص المرئية للمستخدم في strings.xml، وجميع الألوان في colors.xml، وجميع قياسات التخطيط في dimens.xml. أشر إليها بـ @string/ و@color/ و@dimen/ في XML وبالفئة R في Java. في الدرس القادم ستستخدم Intents للتنقل بين Activity والأخرى — وستنتقل معك التسميات والألوان التي عرّفتها هنا.