العناصر المرئية والأدوات الشائعة
العناصر المرئية والأدوات الشائعة
كل عنصر مرئي على شاشة Android هو فئة فرعية من android.view.View. يأتي Android مزوّدًا بعشرات الفئات الفرعية الجاهزة — تُسمّى الأدوات (Widgets) — تغطّي الغالبية العظمى من احتياجات واجهة المستخدم. في هذا الدرس ستعمل عن كثب مع أربعة منها وهي الأساسية: TextView وButton وEditText وImageView. ستتعلّم كيف يُعلن عن كلٍّ منها في XML، وكيف يُربط في Java، والسمات الرئيسية واستدعاءات الواجهة البرمجية التي يلجأ إليها كل مطوّر Android يوميًا.
التعريف بـ XML مقابل الإنشاء في Java
يحثّ Android بشدة على تعريف واجهة المستخدم في ملفات XML للتخطيط (داخل res/layout/)، ثم الإشارة إلى تلك العناصر في Java عبر findViewById(). هذا الفصل يُبقي اهتمامات التصميم بعيدة عن المنطق التجاري ويُتيح لأدوات تحرير التخطيط وأدوات إمكانية الوصول فحص واجهة المستخدم بمعزل عن الكود التشغيلي.
يجب أن يوفّر كل عنصر XML بالضرورة سمتَي android:layout_width وandroid:layout_height. القيمتان الأكثر شيوعًا هما wrap_content (الحجم وفق المحتوى) وmatch_parent (ملء المساحة المتاحة).
TextView — عرض النصوص
TextView هو الأداة الأكثر استخدامًا في Android. يعرض سلسلة نصية ويدعم التنسيق الغني والروابط القابلة للنقر والرسومات المصاحبة والامتدادات المُعلَّمة بـ HTML.
السمات الرئيسية: android:text يضبط التسمية الثابتة (يُفضَّل استخدام موارد السلاسل: @string/greeting). يجب أن تستخدم android:textSize وحدات sp حتى تحترم تفضيل المستخدم لحجم الخط في النظام. يقبل android:textColor ألوانًا بالتنسيق الست عشري أو موارد الألوان.
في Java تحصل على مرجع وتتعامل معه في وقت التشغيل:
sp لأحجام النص وdp لكل شيء آخر. يتناسب sp (البكسل المستقل عن الحجم) مع إعدادات إمكانية الوصول للخط الخاصة بالمستخدم. تثبيت حجم النص بـ px أو dp يجعل تطبيقك غير قابل للوصول للمستخدمين الذين يحتاجون نصًا أكبر.
Button — التعامل مع النقرات
يمتدّ Button من TextView، لذا تنطبق عليه كل سمات النص. مهمته الأساسية هي تشغيل إجراء عندما ينقر المستخدم عليه. الطريقة المُفضَّلة لتلقّي النقرات هي إرفاق OnClickListener في الكود — لا تستخدم السمة المهملة android:onClick في المشاريع الجديدة.
الصيغة اللامبدية أكثر إيجازًا بمجرد أن تتقن الفئات المجهولة:
btnSave.setEnabled(false) قبل بدء عملية شبكة أو قاعدة بيانات، ثم btnSave.setEnabled(true) عند اكتمالها. يمنع هذا عمليات الإرسال المكررة — إحدى أكثر الأخطاء شيوعًا في نماذج Android.
EditText — قبول مدخلات المستخدم
EditText هو TextView مع تفعيل التحرير. إنه الطريقة الأساسية لكتابة المستخدمين في تطبيقك. تُعدّ سمة android:inputType بالغة الأهمية: فهي تُعلم لوحة المفاتيح الناعمة بنوع المدخلات المطلوب وتُفعّل تلميحات التحقق التلقائي.
قيم inputType الشائعة: text وtextPassword وtextEmailAddress وphone وnumber وnumberDecimal وtextMultiLine. تُغيّر كل قيمة تخطيط لوحة المفاتيح المعروضة للمستخدم.
استخدم setError() لعرض رسالة تحقق مباشرة تحت الحقل — يرسم Android أيقونة حمراء ومؤشر نصي تلقائيًا. اقرنها مع requestFocus() لتمرير المستخدم نحو حقل المشكلة.
EditText داخل onResume() أو مؤقّت. اقرأ المحتوى فقط عندما يُشغّل المستخدم إجراءً (نقر زر، أو إجراء IME). القراءة المتواصلة تُبطل الغرض من المدخلات التي يبادر بها المستخدم وتُهدر طاقة المعالج.
ImageView — عرض الصور
يعرض ImageView موارد drawable أو صورة bitmap محمّلة في وقت التشغيل أو صورة بعيدة (عبر مكتبة كـ Glide أو Picasso). أهم سمتين هما android:src (مصدر الصورة) وandroid:scaleType (كيفية تحجيم الصورة أو قصّها داخل حدود العرض).
قيم scaleType الشائعة:
centerCrop— تحجيم متناسق حتى يملأ كلا البُعدين العرض؛ قصّ الزيادة. الأفضل لصور الملفات الشخصية.fitCenter— تحجيم متناسق حتى تتناسب الصورة كاملةً داخل العرض مع وجود هوامش. جيد للشعارات والأيقونات.centerInside— مثلfitCenterلكنه لا يُكبّر الصورة الأصغر من العرض أبدًا.fitXY— تمديد لملء الحجم تمامًا متجاهلًا نسبة العرض إلى الارتفاع. يبدو خاطئًا في معظم الحالات.
تغيير الصورة في وقت التشغيل:
android:contentDescription على كل ImageView. تُعلن قارئات الشاشة (TalkBack) هذه السلسلة للمستخدمين ضعاف البصر. إذا كانت الصورة زخرفية بحتة، اضبطها على سلسلة فارغة ("") لكي يتخطّاها TalkBack. يولّد إغفالها تحذير lint وتفشل في تدقيقات إمكانية الوصول.
ربط كل شيء معًا — مثال واقعي
إليك نموذج تسجيل مضغوط يوضّح عمل الأدوات الأربع معًا:
الخلاصة
يعرض TextView النصوص؛ تحكّم في حجمه بـ sp وفي أسلوبه بسمات النص المتعددة. يُشغّل Button OnClickListener — أرفقه في Java لا في XML. يجمع EditText المدخلات المكتوبة؛ حدّد inputType دائمًا وتحقّق من الصحة بـ setError(). يعرض ImageView الصور؛ اختر scaleType المناسب وزوّد دائمًا contentDescription. في الدرس القادم ستتناول أحداث تفاعل المستخدم بعمق أكبر.