EditText في Kotlin: 5 طرق لتعيين النص وأيها تختار

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: سطر واحد — مليون سؤال

\n

هل سبق لك أن كتبت في الكود editText.text = "مرحبًا" وحصلت على خطأ في الترجمة؟ أو على العكس، كان الكود يعمل، لكن IDE وضع خطًا أصفر تحت السطر؟ تهانينا: لقد واجهت "الصداع الكلاسيكي" لكل مطور Android ينتقل إلى Kotlin.

\n

موضوع Setting text in EditText Kotlin هو أحد أكثر الاستفسارات شيوعًا على Stack Overflow (آلاف المشاهدات!). للوهلة الأولى، المهمة تافهة: أخذ القيمة وتعيينها. لكن في Kotlin هناك تفاصيل دقيقة تحول العملية البسيطة إلى مجال للنقاش. في هذه المقالة، سنشرح جميع الأساليب الحالية: من findViewById القديم إلى view binding الحديث وDataBinding. ستتعرف على الطريقة التي تختارها لمشروع جديد وكيف لا تقع في فخ أنواع البيانات.

\n

هيا بنا! 🚀

\n\n

لماذا لا يعمل ببساطة "text = ..."؟

\n

إذا حاولت كتابة:

\n
val editText = findViewById<EditText>(R.id.my_edit_text)\neditText.text = "نص جديد"
\n

سيصدر المترجم خطأ: Type mismatch. Required: Editable! Found: String.

\n

السبب هو أن الخاصية text في EditText من النوع Editable (وليس String). في Java اعتدنا على setText(CharSequence)، لكن Kotlin "تحت الغطاء" يترجم هذا إلى setter الخاصية الذي يتوقع Editable. هناك حل — وليس واحدًا فقط.

\n\n

الطريقة رقم 1: الكلاسيكية — findViewById + setText

\n

الطريقة الأكثر مباشرة، والتي تعمل مع SDK 1.0. لا تتطلب مكتبات إضافية وهي مفهومة حتى للمبتدئين.

\n
val editText = findViewById<EditText>(R.id.my_edit_text)\neditText.setText("مرحبًا بالعالم!")
\n

هنا نستدعي طريقة Java setText(CharSequence) التي تقبل سلسلة نصية. في Kotlin يبدو هذا كاستدعاء دالة عادي.

\n

المزايا:

\n
    \n
  • أقل كود ممكن
  • \n
  • لا يتطلب استيرادات (باستثناء الأساسية)
  • \n
  • يعمل في أي Fragment/Activity
  • \n
\n

العيوب:

\n
    \n
  • البحث اليدوي عن view — سهولة الخطأ في id
  • \n
  • Null safety غير مضمون: يجب التحقق من null
  • \n
  • أبطأ من binding (لكن الفرق غير ملحوظ لحقل واحد)
  • \n
\n

متى تستخدم: في المشاريع القديمة (legacy)، في الكود للنمذجة السريعة، أو في الحالات التي تعرف فيها بالتأكيد أن view موجود.

\n\n

الطريقة رقم 2: Kotlin Android Extensions (synthetic)

\n

في السابق، كانت هذه "الرصاصة الفضية" لمطوري Kotlin. كنت تكتب ببساطة my_edit_text.text = "نص" — وكان كل شيء يعمل. كان السحر يكمن في التوليد التلقائي للخصائص الاصطناعية (synthetic properties).

\n
// build.gradle (app) — كان يجب سابقًا إضافة:\n// apply plugin: 'kotlin-android-extensions'\n// الآن الإضافة قديمة!\n\n// في الكود:\nimport kotlinx.android.synthetic.main.activity_main.*\n\nmy_edit_text.setText("نص عبر synthetic")
\n

المزايا:

\n
    \n
  • موجز جدًا
  • \n
  • لا حاجة لكتابة findViewById
  • \n
  • يدعم null safety في البداية
  • \n
\n

العيوب:

\n
    \n
  • الإضافة مُعلنة كقديمة (deprecated) منذ Kotlin 1.8. توصي Google بالترحيل إلى View Binding
  • \n
  • لا يعمل مع Fragments إذا تم إعادة استخدام layout
  • \n
  • ينشئ سياقًا عالميًا — احتمالية تسرب الذاكرة

هام: إذا كنت تبدأ مشروعًا جديدًا في 2024–2025 — لا تستخدم هذا الأسلوب. للمشاريع القديمة — خطط للترحيل.

\n\n

الطريقة رقم 3: View Binding — المعيار الحديث

\n

حتى الآن، View Binding هو الأسلوب الموصى به رسميًا للعمل مع view في Android. يقوم بإنشاء فئة Binding لكل ملف layout، مما يعطي وصولاً لكل view بالاسم.

\n
// 1. نفعّله في build.gradle (app):\nandroid {\n    ...\n    buildFeatures                

المدونات

توصيات الكتب