InputType — ما هو، سمات الإدخال وتكوينها في Android

المؤلف: IT Sectr نُشر: 2026-07-07 وقت القراءة: 9 دق

InputType هي سمة من سمات Android تحدد طبيعة بيانات الإدخال وسلوك لوحة المفاتيح لحقول النص. قيمة InputType هي قناع بتات يجمع بين فئة الإدخال (نص، رقم، هاتف، تاريخ) والمعدلات (متعدد الأسطر، تصحيح تلقائي، أحرف كبيرة، إدخال مخفي). يؤثر InputType على نوع لوحة المفاتيح المعروضة، وتصفية الأحرف المدخلة، وسلوك الملء التلقائي. وفقًا لـ Android Developers (2026)، يُعد InputType أحد أهم السمات لضمان إدخال بيانات صحيح ويجب تعيينه صراحةً لكل حقل نصي قابل للتحرير.

الخلاصة

  • InputType — قناع بتات يحدد فئة الإدخال والمعدلات لـ EditText.
  • فئات الإدخال — TYPE_CLASS_TEXT, TYPE_CLASS_NUMBER, TYPE_CLASS_PHONE, TYPE_CLASS_DATETIME.
  • المعدلات — أعلام توضح السلوك: MULTI_LINE, AUTO_CORRECT, PASSWORD, CAP_SENTENCES.
  • الدمج — يتم دمج الفئة والمعدلات عبر OR على مستوى البتات لتكوين دقيق.
  • التأثير — InputType الصحيح يسرع الإدخال، ويقلل الأخطاء، ويحسن تجربة المستخدم للنموذج.

ما هو InputType في Android

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 افتراضيًا.

kotlin
// ثوابت 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

فئات InputType: TEXT, NUMBER, PHONE, DATETIME

يحدد Android أربع فئات أساسية لـ InputType. تتوافق كل فئة مع فئة بيانات محددة وتنشط نوع لوحة المفاتيح المقابل. يتم تحديد الفئة في البتات 0–4 من قناع البتات ويمكن استخراجها عبر قناع TYPE_MASK_CLASS (0x0F).

الفئةالثابتلوحة المفاتيحالاستخدام
TEXTTYPE_CLASS_TEXT (1)لوحة مفاتيح QWERTYنص، تعليقات، وصف
NUMBERTYPE_CLASS_NUMBER (2)رقميةكمية، سعر، عمر
PHONETYPE_CLASS_PHONE (3)هاتفرقم هاتف
DATETIMETYPE_CLASS_DATETIME (4)تاريخ/وقتتاريخ، وقت

TYPE_CLASS_DATETIME نادرًا ما يُستخدم مباشرة — عادةً ما يتم إدخال التاريخ باستخدام DatePicker أو DatePickerDialog بدلاً من حقل نصي. ومع ذلك، في بعض السيناريوهات (إدخال تاريخ يدوي سريع)، يمكن أن تكون هذه الفئة مفيدة. ليس لديها لوحة مفاتيح متخصصة وعادةً ما تعرض لوحة مفاتيح رقمية.

يمكن دمج كل فئة إدخال مع الاختلافات — أنواع فرعية محددة في البتات 5–7. على سبيل المثال، TYPE_TEXT_VARIATION_PASSWORD (البت 5) يضيف إدخالًا مخفيًا إلى فئة TEXT. بتات الاختلاف: 0x000000E0 (قناع TYPE_MASK_VARIATION).

أعلام InputType المعدلة

الأعلام المعدلة لـ InputType (البتات 8–31) تضيف إمكانيات إضافية إلى الفئة الأساسية. لا تغير نوع لوحة المفاتيح ولكنها تعدل سلوك الإدخال. الأعلام خاصة بكل فئة — أعلام TEXT لا تعمل مع NUMBER، والعكس صحيح. فيما يلي المعدلات الرئيسية لكل فئة.

أعلام TEXT

  • TYPE_TEXT_FLAG_CAP_CHARACTERS — جميع الأحرف كبيرة.
  • TYPE_TEXT_FLAG_CAP_WORDS — كل كلمة تبدأ بحرف كبير.
  • TYPE_TEXT_FLAG_CAP_SENTENCES — حرف كبير في بداية الجملة (افتراضي).
  • TYPE_TEXT_FLAG_AUTO_CORRECT — تصحيح تلقائي للأخطاء المطبعية.
  • TYPE_TEXT_FLAG_AUTO_COMPLETE — إكمال تلقائي (لـ AutoCompleteTextView).
  • TYPE_TEXT_FLAG_MULTI_LINE — إدخال متعدد الأسطر.
  • TYPE_TEXT_FLAG_NO_SUGGESTIONS — تعطيل الاقتراحات.

أعلام NUMBER

  • TYPE_NUMBER_FLAG_SIGNED — يسمح بالأرقام السالبة (علامة الطرح).
  • TYPE_NUMBER_FLAG_DECIMAL — يسمح بالفاصلة العشرية.

وفقًا لـ Android Developers Documentation (2026)، لا تتداخل أعلام الفئات المختلفة — محاولة استخدام علم TEXT مع NUMBER سيتم تجاهلها. للتحقق من وجود علم، استخدم AND على مستوى البتات: (inputType and FLAG) != 0.

مجموعات InputType: أمثلة لسيناريوهات مختلفة

المزيج الصحيح من فئات وأعلام InputType هو مفتاح إنشاء نماذج سهلة الاستخدام. دعونا نلقي نظرة على السيناريوهات النموذجية وتكوينات InputType المقابلة لها. كل سيناريو يحسن الإدخال لنوع بيانات محدد، مما يجعل النموذج بديهيًا ويسرع من تعبئته.

السيناريوInputTypeلوحة المفاتيح
الاسمtextCapWordsQWERTY، كل كلمة بحرف كبير
البريد الإلكترونيtextEmailAddressQWERTY مع @ و .
كلمة المرورtextPasswordQWERTY، إدخال مخفي
الهاتفphoneأرقام مع +, #, *
السعرnumberDecimalأرقام مع فاصلة عشرية
الكميةnumberأرقام فقط
تعليقtextCapSentences|textMultiLineQWERTY، متعدد الأسطر
بحثtext|textNoSuggestionsQWERTY بدون اقتراحات
kotlin
// مزيج لحقل السعر
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

تعيين InputType برمجيًا عبر setInputType() يستبدل القيمة السابقة. إذا كنت بحاجة إلى تغيير جزء فقط من القناع (على سبيل المثال، إضافة علم)، فيجب عليك حفظ القيمة الحالية، وتعديلها، وتطبيقها مرة أخرى. كل استدعاء لـ setInputType() يعيد تكوين المرشحات الداخلية لـ EditText.

تختلف طريقة setRawInputType() عن setInputType في أنها لا تؤدي إلى إعادة تكوين المرشحات والاقتراحات. تُستخدم لتغيير InputType مؤقتًا دون إعادة تحميل كاملة لحالة EditText. بعد استدعاء setInputType()، يوصى بإعادة تشغيل IME لتحديث لوحة المفاتيح.

تبديل الأوضاع

kotlin
// التبديل بين كلمة المرور والنص المرئي
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)
}

استخراج الفئة والاختلاف

kotlin
// الحصول على فئة الإدخال
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 الصحيح لا يتعلق فقط بتجربة المستخدم، بل أيضًا بالأمان وصحة البيانات. تشمل التوصيات الرئيسية: تحديد InputType صريح دائمًا لكل EditText؛ استخدام فئة الإدخال الأكثر تحديدًا ممكنة؛ عدم دمج أعلام من فئات مختلفة؛ استخدام اختلافات PASSWORD لحقول البيانات الحساسة؛ استخدام imeOptions="actionSearch" لحقول البحث.

InputType يؤثر أيضًا على عمل خدمات الوصول (Accessibility). الحقول من نوع textPassword تتلقى حماية إضافية من قارئات الشاشة — فهي لا تقرأ الأحرف المدخلة بصوت عالٍ. لحقول textEmailAddress، تخبر قارئة الشاشة المستخدم أن الحقل مخصص للبريد الإلكتروني وتقدم اقتراحات مناسبة.

  • الصراحة — حدد InputType دائمًا بشكل صريح، لا تعتمد على القيمة الافتراضية (textMultiLine).
  • التحديد — استخدم النوع الأكثر تحديدًا: textEmailAddress، وليس text، للبريد الإلكتروني.
  • الأمان — لكلمات المرور وأرقام PIN وبيانات البطاقات، استخدم اختلافات PASSWORD.
  • الملء التلقائي — ادمج InputType مع autofillHints لدعم مديري كلمات المرور.
  • الاختبار — اختبر السلوك على لوحات مفاتيح مختلفة (Gboard، SwiftKey، Samsung Keyboard).

وفقًا لـ Material Design Guidelines (2025)، يجب أن يتطابق InputType مع نوع البيانات التي يدخلها المستخدم. InputType غير الصحيح لا يبطئ الإدخال فحسب، بل قد يؤدي أيضًا إلى أخطاء: على سبيل المثال، إذا تركت textMultiLine لحقل رقم هاتف، لن تظهر لوحة المفاتيح الرقمية وسيضطر المستخدم إلى تبديل التخطيطات يدويًا في كل مرة.

الأسئلة الشائعة

كيف يختلف InputType عن Keyboard Type؟

InputType هي سمة من سمات EditText تحدد نوع بيانات الإدخال من خلال قناع بتات. Keyboard Type هو اسم غير رسمي لنوع لوحة المفاتيح المرئي الذي يتم تنشيطه بواسطة InputType. يؤثر InputType أيضًا على تصفية الأحرف والتصحيح التلقائي والإكمال التلقائي — وليس فقط تخطيط لوحة المفاتيح.

كيفية إعادة تعيين InputType إلى القيمة الافتراضية؟

قم بتعيين editText.inputType = InputType.TYPE_CLASS_TEXT أو استخدم الثابت InputType.TYPE_NULL (0x00000000) لإعادة تعيين كاملة. مع TYPE_NULL، لن يظهر الحقل لوحة مفاتيح عند التركيز. للعودة إلى إدخال النص القياسي، قم بتعيين TYPE_CLASS_TEXT بدون أعلام.

هل يمكنني إنشاء InputType مخصص؟

لا يمكنك إنشاء فئة InputType جديدة، لأنها جزء من إطار عمل Android. ومع ذلك، يمكنك دمج الفئات والأعلام الموجودة لتحقيق السلوك المطلوب. قم بتنفيذ تصفية الأحرف الإضافية من خلال InputFilter، الذي يتم تعيينه على EditText باستخدام طريقة setFilters().

كيف يؤثر InputType على IME (لوحة المفاتيح)؟

يتم تمرير InputType إلى نظام الإدخال عبر InputConnection. يقرأ IME فئة InputType والاختلاف ويحدد تخطيط لوحة المفاتيح المقابل. على سبيل المثال، TYPE_CLASS_NUMBER مع TYPE_NUMBER_FLAG_DECIMAL يجعل لوحة المفاتيح تظهر لوحة رقمية بفاصلة عشرية. معظم لوحات المفاتيح الحديثة تتبع هذه التوصيات.

كيفية التحقق من InputType في وقت التشغيل؟

استخدم الخاصية editText.inputType في Kotlin أو editText.getInputType() في Java. لاستخراج الفئة، طبق القناع: inputType and InputType.TYPE_MASK_CLASS. للتحقق من علم معين: inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — إذا كانت النتيجة != 0، فإن العلم مضبوط.

الملخص

  • InputType — قناع بتات يتكون من فئة إدخال (TEXT, NUMBER, PHONE, DATETIME) ومعدلات.
  • فئة الإدخال تحدد نوع البيانات الأساسي ونوع لوحة المفاتيح المعروضة.
  • المعدلات توضح السلوك: متعدد الأسطر، تصحيح تلقائي، أحرف كبيرة، إدخال مخفي.
  • الدمج عبر OR على مستوى البتات يسمح بإنشاء تكوينات دقيقة لسيناريوهات مختلفة.
  • اختلافات PASSWORD تعطل التصحيح التلقائي، تخفي الأحرف، وتمنع التخزين في القاموس.
  • الإعداد البرمجي عبر setInputType() يتطلب إعادة تشغيل IME لتحديث لوحة المفاتيح.
  • أفضل الممارسات — حدد InputType صراحةً، استخدم أنواعًا محددة، واختبر على لوحات مفاتيح مختلفة.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا