InputType هي سمة من سمات Android تحدد طبيعة بيانات الإدخال وسلوك لوحة المفاتيح لحقول النص. قيمة InputType هي قناع بتات يجمع بين فئة الإدخال (نص، رقم، هاتف، تاريخ) والمعدلات (متعدد الأسطر، تصحيح تلقائي، أحرف كبيرة، إدخال مخفي). يؤثر InputType على نوع لوحة المفاتيح المعروضة، وتصفية الأحرف المدخلة، وسلوك الملء التلقائي. وفقًا لـ Android Developers (2026)، يُعد InputType أحد أهم السمات لضمان إدخال بيانات صحيح ويجب تعيينه صراحةً لكل حقل نصي قابل للتحرير.
الخلاصة
InputType هو ثابت صحيح (Int) يشفر وضع الإدخال لحقل نصي. في Android، يتم تعريفه في الفئة android.text.InputType. تتكون قيمة InputType من جزأين: فئة الإدخال (البتات 0–4) والمعدلات (البتات 5–31). تحدد فئة الإدخال نوع البيانات الأساسي — نص، رقم، هاتف، تاريخ. توضح المعدلات السلوك داخل الفئة المحددة — على سبيل المثال، لفئة النص، يمكنك تمكين التصحيح التلقائي، الأحرف الكبيرة، أو الإدخال متعدد الأسطر.
تعمل آلية InputType على ثلاثة مستويات: على مستوى إطار عمل Android، تحدد أي InputConnection سيتم إنشاؤه (الاتصال بين EditText و IME)؛ على مستوى IME (لوحة المفاتيح)، تحدد الأحرف التي سيتم عرضها وكيفية معالجة الإدخال؛ على مستوى التطبيق، تقوم بتصفية الأحرف عبر InputFilter المدمج في EditText. وفقًا لـ Android Source Code (AOSP, 2026)، تتم معالجة قناع البتات في طريقة TextView.getInputType()، التي تعيد القيمة الحالية، و setInputType()، التي تعيد تكوين المرشحات الداخلية والاتصال بـ IME.
ميزة مهمة لـ InputType هي أنه لا يمكن قراءته من عملية أخرى لأسباب أمنية. يمنع هذا سرقة البيانات من خلال الوصول إلى نوع الإدخال (على سبيل المثال، تحديد ما إذا كان الحقل كلمة مرور). عند محاولة قراءة InputType من تطبيق آخر، يتم إرجاع TYPE_CLASS_TEXT افتراضيًا.
// ثوابت InputType الأساسية
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// قناع لاستخراج الفئة
InputType.TYPE_MASK_CLASS // 0x0000000F
يحدد Android أربع فئات أساسية لـ InputType. تتوافق كل فئة مع فئة بيانات محددة وتنشط نوع لوحة المفاتيح المقابل. يتم تحديد الفئة في البتات 0–4 من قناع البتات ويمكن استخراجها عبر قناع TYPE_MASK_CLASS (0x0F).
| الفئة | الثابت | لوحة المفاتيح | الاستخدام |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | لوحة مفاتيح QWERTY | نص، تعليقات، وصف |
| NUMBER | TYPE_CLASS_NUMBER (2) | رقمية | كمية، سعر، عمر |
| PHONE | TYPE_CLASS_PHONE (3) | هاتف | رقم هاتف |
| DATETIME | TYPE_CLASS_DATETIME (4) | تاريخ/وقت | تاريخ، وقت |
TYPE_CLASS_DATETIME نادرًا ما يُستخدم مباشرة — عادةً ما يتم إدخال التاريخ باستخدام DatePicker أو DatePickerDialog بدلاً من حقل نصي. ومع ذلك، في بعض السيناريوهات (إدخال تاريخ يدوي سريع)، يمكن أن تكون هذه الفئة مفيدة. ليس لديها لوحة مفاتيح متخصصة وعادةً ما تعرض لوحة مفاتيح رقمية.
يمكن دمج كل فئة إدخال مع الاختلافات — أنواع فرعية محددة في البتات 5–7. على سبيل المثال، TYPE_TEXT_VARIATION_PASSWORD (البت 5) يضيف إدخالًا مخفيًا إلى فئة TEXT. بتات الاختلاف: 0x000000E0 (قناع TYPE_MASK_VARIATION).
الأعلام المعدلة لـ InputType (البتات 8–31) تضيف إمكانيات إضافية إلى الفئة الأساسية. لا تغير نوع لوحة المفاتيح ولكنها تعدل سلوك الإدخال. الأعلام خاصة بكل فئة — أعلام TEXT لا تعمل مع NUMBER، والعكس صحيح. فيما يلي المعدلات الرئيسية لكل فئة.
وفقًا لـ Android Developers Documentation (2026)، لا تتداخل أعلام الفئات المختلفة — محاولة استخدام علم TEXT مع NUMBER سيتم تجاهلها. للتحقق من وجود علم، استخدم AND على مستوى البتات: (inputType and FLAG) != 0.
المزيج الصحيح من فئات وأعلام InputType هو مفتاح إنشاء نماذج سهلة الاستخدام. دعونا نلقي نظرة على السيناريوهات النموذجية وتكوينات InputType المقابلة لها. كل سيناريو يحسن الإدخال لنوع بيانات محدد، مما يجعل النموذج بديهيًا ويسرع من تعبئته.
| السيناريو | InputType | لوحة المفاتيح |
|---|---|---|
| الاسم | textCapWords | QWERTY، كل كلمة بحرف كبير |
| البريد الإلكتروني | textEmailAddress | QWERTY مع @ و . |
| كلمة المرور | textPassword | QWERTY، إدخال مخفي |
| الهاتف | phone | أرقام مع +, #, * |
| السعر | numberDecimal | أرقام مع فاصلة عشرية |
| الكمية | number | أرقام فقط |
| تعليق | textCapSentences|textMultiLine | QWERTY، متعدد الأسطر |
| بحث | text|textNoSuggestions | QWERTY بدون اقتراحات |
// مزيج لحقل السعر
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// مزيج لحقل التعليق
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
تعيين InputType برمجيًا عبر setInputType() يستبدل القيمة السابقة. إذا كنت بحاجة إلى تغيير جزء فقط من القناع (على سبيل المثال، إضافة علم)، فيجب عليك حفظ القيمة الحالية، وتعديلها، وتطبيقها مرة أخرى. كل استدعاء لـ setInputType() يعيد تكوين المرشحات الداخلية لـ EditText.
تختلف طريقة setRawInputType() عن setInputType في أنها لا تؤدي إلى إعادة تكوين المرشحات والاقتراحات. تُستخدم لتغيير InputType مؤقتًا دون إعادة تحميل كاملة لحالة EditText. بعد استدعاء setInputType()، يوصى بإعادة تشغيل IME لتحديث لوحة المفاتيح.
// التبديل بين كلمة المرور والنص المرئي
fun togglePasswordVisibility(editText: EditText) {
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
editText.inputType = if (isPassword) {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// الاحتفاظ بموضع المؤشر
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// الحصول على فئة الإدخال
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// الحصول على اختلاف الإدخال
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// التحقق مما إذا كان حقل كلمة مرور
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
اختيار InputType الصحيح لا يتعلق فقط بتجربة المستخدم، بل أيضًا بالأمان وصحة البيانات. تشمل التوصيات الرئيسية: تحديد InputType صريح دائمًا لكل EditText؛ استخدام فئة الإدخال الأكثر تحديدًا ممكنة؛ عدم دمج أعلام من فئات مختلفة؛ استخدام اختلافات PASSWORD لحقول البيانات الحساسة؛ استخدام imeOptions="actionSearch" لحقول البحث.
InputType يؤثر أيضًا على عمل خدمات الوصول (Accessibility). الحقول من نوع textPassword تتلقى حماية إضافية من قارئات الشاشة — فهي لا تقرأ الأحرف المدخلة بصوت عالٍ. لحقول textEmailAddress، تخبر قارئة الشاشة المستخدم أن الحقل مخصص للبريد الإلكتروني وتقدم اقتراحات مناسبة.
وفقًا لـ Material Design Guidelines (2025)، يجب أن يتطابق InputType مع نوع البيانات التي يدخلها المستخدم. InputType غير الصحيح لا يبطئ الإدخال فحسب، بل قد يؤدي أيضًا إلى أخطاء: على سبيل المثال، إذا تركت textMultiLine لحقل رقم هاتف، لن تظهر لوحة المفاتيح الرقمية وسيضطر المستخدم إلى تبديل التخطيطات يدويًا في كل مرة.
الأسئلة الشائعة
InputType هي سمة من سمات EditText تحدد نوع بيانات الإدخال من خلال قناع بتات. Keyboard Type هو اسم غير رسمي لنوع لوحة المفاتيح المرئي الذي يتم تنشيطه بواسطة InputType. يؤثر InputType أيضًا على تصفية الأحرف والتصحيح التلقائي والإكمال التلقائي — وليس فقط تخطيط لوحة المفاتيح.
قم بتعيين editText.inputType = InputType.TYPE_CLASS_TEXT أو استخدم الثابت InputType.TYPE_NULL (0x00000000) لإعادة تعيين كاملة. مع TYPE_NULL، لن يظهر الحقل لوحة مفاتيح عند التركيز. للعودة إلى إدخال النص القياسي، قم بتعيين TYPE_CLASS_TEXT بدون أعلام.
لا يمكنك إنشاء فئة InputType جديدة، لأنها جزء من إطار عمل Android. ومع ذلك، يمكنك دمج الفئات والأعلام الموجودة لتحقيق السلوك المطلوب. قم بتنفيذ تصفية الأحرف الإضافية من خلال InputFilter، الذي يتم تعيينه على EditText باستخدام طريقة setFilters().
يتم تمرير InputType إلى نظام الإدخال عبر InputConnection. يقرأ IME فئة InputType والاختلاف ويحدد تخطيط لوحة المفاتيح المقابل. على سبيل المثال، TYPE_CLASS_NUMBER مع TYPE_NUMBER_FLAG_DECIMAL يجعل لوحة المفاتيح تظهر لوحة رقمية بفاصلة عشرية. معظم لوحات المفاتيح الحديثة تتبع هذه التوصيات.
استخدم الخاصية editText.inputType في Kotlin أو editText.getInputType() في Java. لاستخراج الفئة، طبق القناع: inputType and InputType.TYPE_MASK_CLASS. للتحقق من علم معين: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — إذا كانت النتيجة != 0، فإن العلم مضبوط.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا