EditText هو مكون Android أساسي مصمم لإدخال وتحرير النص في واجهة المستخدم. يرث من TextView ويتيح إدخال الأحرف عبر لوحات المفاتيح الافتراضية أو الفيزيائية. يدعم EditText أوضاعاً متعددة: نص أحادي ومتعدد الأسطر، كلمات مرور، أرقام، عناوين بريد إلكتروني وأرقام هواتف. وفقاً لـ Android Developers (2026)، يتم استخدام EditText في أكثر من 90% من تطبيقات Android لإنشاء النماذج وحقول البحث والدردشات وشاشات إدخال البيانات.
الرئيسية
EditText هو فئة من حزمة android.widget تنفذ حقل نص تفاعلي لإدخال بيانات المستخدم. في تسلسل الوراثة في Android، يمتد EditText من TextView، لذلك يرث جميع خصائص تسمية النص، بما في ذلك إدارة الخطوط والألوان والمحاذاة. الفرق الرئيسي بين EditText و TextView هو القدرة على تحرير المحتوى — يمكن للمستخدم إدخال النص وحذفه وتعديله مباشرة في الواجهة.
كل EditText مرتبط بمثيل Editable يخزن النص المُدخل ويدعم عمليات الإدراج والحذف والاستبدال. عند الكتابة، يدير EditText تلقائياً موضع المؤشر واختيار النص وسجل التغييرات للتراجع/الإعادة. وفقاً لـ Android Developers Guide (2026)، يدعم EditText أيضاً الإكمال التلقائي عبر فئة AutoCompleteTextView، التي ترث من EditText.
تم تصميم بنية EditText على فصل النموذج (Editable) والعرض (TextView) والمتحكم (InputConnection). عند الحصول على التركيز، ينشئ EditText InputConnection الذي يمرر من خلاله نظام الإدخال الأحرف وضغطات المفاتيح وأوامر التحرير. تضمن هذه الآلية التوافق مع أي طريقة إدخال — من لوحات المفاتيح الافتراضية إلى لوحات مفاتيح Bluetooth الفيزيائية والإدخال الصوتي.
val editText = EditText(context).apply {
hint = "أدخل النص"
inputType = InputType.TYPE_CLASS_TEXT
maxLines = 1
setTextColor(Color.parseColor("#000000"))
}
يوفر EditText عشرات السمات لضبط السلوك والمظهر بدقة. يمكن تعيينها سواء في تخطيطات XML أو برمجياً عبر Kotlin أو Java. تنقسم السمات إلى فئات: التحكم في النص، القيود، التنسيق البصري والتفاعل مع لوحة المفاتيح.
| السمة | الوصف | قيمة مثال |
|---|---|---|
| android:hint | نص تلميحي يظهر في الحقل الفارغ | "أدخل البريد الإلكتروني" |
| android:inputType | وضع الإدخال (نص، رقم، كلمة مرور، إلخ) | textEmailAddress |
| android:maxLines | الحد الأقصى لعدد الأسطر | 3 |
| android:maxLength | الحد الأقصى لطول النص بالأحرف | 100 |
| android:textColorHint | لون النص التلميحي | #999999 |
السمة android:hint هي من أهم السمات — فهي تخبر المستخدم بالبيانات المتوقعة في الحقل. عند إدخال النص، يختفي التلميح تلقائياً. لا يشارك التلميح في إرسال النموذج ولا يتم حفظه كقيمة للحقل. يوصي Material Design باستخدام TextInputLayout مع علامة عائمة بدلاً من التلميح البسيط لمظهر أكثر حداثة.
<!-- EditText in XML layout -->
@+id/etEmail
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter email"
android:inputType="textEmailAddress"
android:maxLines="1"
android:importantForAutofill="yes" />
تحدد السمة inputType نوع لوحة المفاتيح التي ستظهر للمستخدم والأحرف المسموح بإدخالها. إنها قناع بت حيث يتم دمج فئة الإدخال (TYPE_CLASS_TEXT، TYPE_CLASS_NUMBER، TYPE_CLASS_PHONE) مع المعدلات.
كل وضع إدخال لا يغير تخطيط لوحة المفاتيح فحسب بل يؤثر أيضاً على معالجة النص: في الوضع الرقمي يُسمح فقط بالأرقام والفواصل العشرية، في وضع البريد الإلكتروني يكون الرمز @ وامتدادات النطاق متاحة، وفي وضع الهاتف تُعرض الأرقام والرموز +، #، *. يؤثر اختيار inputType الصحيح بشكل كبير على تجربة المستخدم — لوحة المفاتيح غير المناسبة تجبر المستخدم على تبديل الأوضاع، مما يزيد وقت ملء النموذج بنسبة 30-50%.
وفقاً لـ Material Design Guidelines (2025)، يُوصى باستخدام inputType الأكثر تحديداً لكل حقل: textPassword لكلمات المرور، numberDecimal للأسعار، phone لأرقام الهواتف، textMultiLine للإدخال متعدد الأسطر. هذا يسرع ملء النماذج ويقلل أخطاء الإدخال.
// الإعداد البرمجي لـ inputType
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
TextWatcher هو واجهة لتتبع تغييرات النص في EditText في الوقت الفعلي. يحتوي على ثلاث طرق: beforeTextChanged يُستدعى قبل التغيير، onTextChanged يُستدعى أثناء التغيير، afterTextChanged يُستدعى بعد اكتمال تغيير النص. يُستخدم TextWatcher للتحقق من صحة الإدخال، عد الأحرف، البحث والإكمال التلقائي.
OnEditorActionListener يعالج إجراءات المستخدم على لوحة المفاتيح: الضغط على Done (IME_ACTION_DONE)، Search (IME_ACTION_SEARCH)، Send (IME_ACTION_SEND)، Next (IME_ACTION_NEXT) وغيرها. هذا المستمع مفيد بشكل خاص لتنظيم التنقل في النموذج — عند الضغط على Next، ينتقل التركيز تلقائياً إلى الحقل التالي، وعند الضغط على Done، يتم إخفاء لوحة المفاتيح وتنفيذ الإرسال.
وفقاً لـ Android Developers Blog (2025)، الاستخدام الصحيح لـ OnEditorActionListener مع السمة android:imeOptions يتيح إنشاء نماذج بديهية بدون أزرار إرسال إضافية — يملأ المستخدم الحقول ويضغط Done على لوحة المفاتيح، مما يشغل الحفظ أو البحث.
// TextWatcher للتحقق من البريد الإلكتروني
editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
val isValid = Patterns.EMAIL_ADDRESS.matcher(s).matches()
editText.error = if (isValid) null else "Invalid email format"
}
})
// OnEditorActionListener لإرسال النموذج
editText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
submitForm()
true
} else false
}
لننظر إلى مثال كامل لإنشاء شاشة تسجيل الدخول باستخدام EditText لإدخال البريد الإلكتروني وكلمة المرور. يوضح هذا المثال تكوين inputType والتحقق عبر TextWatcher ومعالجة الضغط على زر تسجيل الدخول.
@+id/etLoginEmail
android:layout_width="match_parent"
android:hint="Email"
android:inputType="textEmailAddress"
android:maxLines="1" />
@+id/etLoginPassword
android:layout_width="match_parent"
android:hint="Password"
android:inputType="textPassword"
android:maxLines="1" />
class LoginFragment : Fragment() {
private lateinit var etEmail: EditText
private lateinit var etPassword: EditText
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
etEmail = view.findViewById(R.id.etLoginEmail)
etPassword = view.findViewById(R.id.etLoginPassword)
etEmail.addTextChangedListener(emailWatcher)
etPassword.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
performLogin()
true
} else false
}
}
}
يدعم EditText التخصيص عبر سمات XML والموضوعات والأنماط. يمكن تغيير لون النص ولون التلميح ولون الخط السفلي (backgroundTint) ونمط الخط وحجم النص وغير ذلك الكثير. توفر Material Components موضوع MaterialComponents.EditText بسمات مخصصة تشمل boxStrokeColor و boxBackgroundColor و endIconMode.
لتغيير لون الخط السفلي لـ EditText، استخدم السمة android:backgroundTint التي تحدد اللون للحالتين الافتراضية والمركزة. في Material Design، يُدار لون الخط السفلي عبر colorPrimary للموضوع. للتخصيص الكامل، يمكنك إنشاء drawable مخصص للخلفية في مجلد res/drawable.
| النمط | السمة | النتيجة |
|---|---|---|
| لون النص | android:textColor | يغير لون النص المُدخل |
| لون التلميح | android:textColorHint | يغير لون النص التلميحي |
| الخط السفلي | android:backgroundTint | يغير لون الخط تحت الحقل |
| حجم الخط | android:textSize | يحدد حجم النص بـ sp |
| الخط | android:fontFamily | يطبق خطاً مخصصاً |
لإنشاء نمط متناسق لجميع حقول EditText في تطبيقك، يُوصى بتعريف نمط عام في الموضوع. يقدم Material Design نمط Widget.MaterialComponents.TextInputLayout.OutlinedBox، الذي يُطبق تلقائياً على جميع حقول الإدخال التي تستخدم TextInputLayout. هذا يضمن مظهراً متناسقاً دون تكرار السمات في كل تخطيط.
الأسئلة الشائعة
EditText يرث من TextView ويضيف إمكانيات تحرير النص. TextView يعرض النص فقط، بينما EditText يسمح للمستخدم بإدخال النص وحذفه وتعديله. يدعم EditText أيضاً inputType و TextWatcher وإدارة المؤشر ووظائف أخرى متعلقة بإدخال البيانات.
استخدم InputFilter — واجهة لتصفية الأحرف المدخلة. يدعم EditText تعيين مصفوفة من المرشحات عبر طريقة setFilters(). على سبيل المثال، InputFilter.LengthFilter يحد من طول النص، بينما يمكن لـ InputFilter مخصص منع أحرف معينة أو تعبيرات منتظمة أو نطاقات Unicode.
استدعِ editText.text.toString() في Kotlin أو editText.getText().toString() في Java. خاصية text ترجع Editable، الذي يُحول إلى String عبر toString(). تحقق دائماً من القيم الخالية والفارغة قبل استخدام النص، خاصة في النماذج ذات الحقول الإلزامية.
عيّن السمة android:inputType="textMultiLine" أو أضف برمجياً العلم InputType.TYPE_TEXT_FLAG_MULTI_LINE. في وضع متعدد الأسطر، يسمح EditText بفواصل الأسطر عبر Enter ويتوسع تلقائياً في الارتفاع. استخدم android:maxLines أو android:minLines لتحديد الارتفاع.
عيّن السمة android:enabled="false" أو استدعِ editText.isEnabled = false في الكود. EditText المعطل لا يستجيب للمس ولا يمكنه الحصول على التركيز ويظهر باللون الرمادي (حالة معطلة). بديل هو استخدام android:focusable="false"، الذي يعطل الإدخال لكنه يحتفظ بالمظهر الطبيعي.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.