Keyboard Type هو تكوين لوحة المفاتيح الافتراضية في Android الذي يحدد مجموعة الأحرف المعروضة وتخطيطها لحقل إدخال معين. يدعم Android العديد من الأنواع المسبقة: text (نص قياسي)، number (رقمي)، phone (هاتفي)، email (برمز @)، textPassword (لكلمات المرور)، datetime وغيرها. يحسن كل نوع واجهة الإدخال لمهمة محددة — على سبيل المثال، تظهر لوحة مفاتيح البريد الإلكتروني رمز @ والنقطة على الشاشة الرئيسية. وفقًا لـ Android Developers (2026)، يقلل اختيار Keyboard Type الصحيح من عدد الضغطات بنسبة 20–40% مقارنة بلوحة المفاتيح النصية القياسية.
الخلاصة
Keyboard Type يتم تحديده بقيمة السمة android:inputType في XML أو عن طريق استدعاء setInputType() برمجيًا في الكود. InputType هو قناع بت حيث يتم دمج فئة الإدخال مع علامات معدلة. الفئات الأساسية هي: TYPE_CLASS_TEXT للنص، TYPE_CLASS_NUMBER للأرقام، TYPE_CLASS_PHONE للهواتف، TYPE_CLASS_DATETIME للتواريخ والأوقات.
يؤثر كل Keyboard Type على ثلاثة جوانب: تخطيط لوحة المفاتيح الافتراضية (ما هي الأحرف المرئية على الشاشة الرئيسية)، تصفية الأحرف المدخلة (ما هي الأحرف المسموح بها)، وسلوك التصحيح التلقائي/الإكمال التلقائي. على سبيل المثال، تعرض لوحة المفاتيح الرقمية الأرقام فقط والفاصل العشري، ولا تظهر الحروف حتى إذا قام المستخدم بتبديل حالة الأحرف. وفقًا لـ Android Developers Documentation (2026)، يسمح دمج الفئات مع العلامات بإنشاء أوضاع متخصصة للغاية: نص متعدد الأسطر مع تصحيح تلقائي، رقم عشري، كلمة مرور مع دعم الملء التلقائي.
من المهم فهم أن Keyboard Type هو توصية لنظام الإدخال (IME). قد تتجاهل بعض لوحات المفاتيح التابعة لجهات خارجية (Gboard، SwiftKey) النوع المحدد جزئيًا إذا قام المستخدم بتعيين تفضيلاته الخاصة. ومع ذلك، تتبع معظم لوحات المفاتيح القياسية في Android وGoogle Gboard نوع الإدخال المحدد بدقة.
// إعداد نوع لوحة المفاتيح برمجيًا
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL or
InputType.TYPE_NUMBER_FLAG_SIGNED
TYPE_CLASS_TEXT هي الفئة الأساسية لإدخال النص. تقوم بتنشيط لوحة المفاتيح QWERTY القياسية بالأحرف والأرقام والرموز. تحتوي فئة النص على أكبر عدد من المعدلات التي تحدد السلوك: TYPE_TEXT_FLAG_CAP_SENTENCES (حرف كبير تلقائي في بداية الجملة)، TYPE_TEXT_FLAG_AUTO_CORRECT (تصحيح تلقائي)، TYPE_TEXT_FLAG_MULTI_LINE (وضع متعدد الأسطر)، TYPE_TEXT_FLAG_NO_SUGGESTIONS (تعطيل الاقتراحات).
يمكن دمج معدلات لوحة المفاتيح النصية لإنشاء تكوينات دقيقة: على سبيل المثال، text|textCapSentences|textAutoCorrect مناسب لحقل إدخال التعليقات حيث تكون الأحرف الكبيرة التلقائية وتصحيح الأخطاء المطبعية مطلوبة. بينما يُستخدم text|textNoSuggestions لإدخال الكود أو المصطلحات الخاصة حيث قد يكون التصحيح التلقائي ضارًا.
وفقًا لـ UX Stack Exchange (2025)، تعمل لوحة المفاتيح النصية مع التصحيح التلقائي على تسريع الكتابة بنسبة 15–25% للمستخدم العادي، ولكن بالنسبة للمصطلحات التقنية (كود، URL، بريد إلكتروني) يُوصى بتعطيل التصحيح التلقائي لأنه غالبًا ما يستبدل المصطلحات الصحيحة بمصطلحات غير صحيحة.
<!-- Text with autocorrect and capital sentences -->
android:inputType="textCapSentences|textAutoCorrect"
<!-- Text without suggestions and autocorrect -->
android:inputType="textNoSuggestions"
TYPE_CLASS_NUMBER يقوم بتنشيط لوحة المفاتيح الرقمية، التي تعرض فقط الأرقام والفاصل العشري وعلامة الطرح. يُستخدم هذا النوع لحقول إدخال الكمية والأسعار والعمر والرموز والبيانات الرقمية الأخرى. تشغل لوحة المفاتيح الرقمية مساحة أقل على الشاشة من لوحة المفاتيح النصية وتزيل إدخال الأحرف العرضي.
Number له ثلاثة معدلات: TYPE_NUMBER_FLAG_DECIMAL يضيف نقطة/فاصلة عشرية، TYPE_NUMBER_FLAG_SIGNED يضيف علامة ناقص للأرقام السالبة، TYPE_NUMBER_VARIATION_PASSWORD — لأكواد PIN حيث تظهر الأرقام كأحرف مخفية. يؤدي الجمع number|numberDecimal|numberSigned إلى إنشاء حقل كامل لإدخال الأرقام العشرية من أي علامة.
// إدخال رقمي بفاصلة عشرية
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// التحقق من الرقم المدخل
val amount = editText.text.toString().toDoubleOrNull() ?: 0.0
TYPE_CLASS_PHONE يقوم بتنشيط لوحة المفاتيح الهاتفية، التي تعرض الأرقام والأحرف النموذجية لأرقام الهواتف: +، #، *، (، ). على عكس لوحة المفاتيح الرقمية، يعرض phone أيضًا تخطيطًا للأحرف في وضع إضافي، لأن أرقام الهواتف يمكن أن تحتوي على أحرف (على سبيل المثال، 1-800-FLOWERS). لا تحتوي فئة phone على علامات إضافية ولكنها تدعم TYPE_TEXT_VARIATION_PHONE_ETC لإدخال الأرقام الفرعية.
TYPE_TEXT_VARIATION_EMAIL_ADDRESS يقوم بتنشيط لوحة مفاتيح البريد الإلكتروني، حيث يكون الرمز @ والنقطة على الشاشة الرئيسية، كما تتوفر امتدادات النطاق الشائعة (.com، .net، .org). يعرض Gboard بالإضافة إلى ذلك أزرارًا بأسماء النطاقات الشائعة عند الكتابة بعد @. تقوم لوحة مفاتيح البريد الإلكتروني بتعطيل التصحيح التلقائي تلقائيًا لأن عناوين البريد الإلكتروني يمكن أن تحتوي على مجموعات أحرف غير قياسية.
وفقًا لـ Google Material Design Guidelines (2025)، لحقول الهاتف يُوصى بالإضافة إلى ذلك بتحديد السمة android:digits، التي تحد من مجموعة الأحرف المسموح بها. لحقول البريد الإلكتروني، من المهم أيضًا تحديد autofillHints="email" لدعم الملء التلقائي من مديري كلمات المرور وGoogle Autofill.
<!-- Email keyboard with autofill -->
android:inputType="textEmailAddress"
android:importantForAutofill="yes"
android:autofillHints="emailAddress"
<!-- Phone keyboard with digit restriction -->
android:inputType="phone"
android:digits="0123456789+"
TYPE_TEXT_VARIATION_PASSWORD و TYPE_NUMBER_VARIATION_PASSWORD هما وضعا إدخال للبيانات الحساسة. عند تعيين textPassword، تظهر الأحرف المدخلة كنقاط أو علامات نجوم (حسب إصدار Android ولوحة المفاتيح). تقوم لوحة المفاتيح في هذا الوضع بتعطيل التصحيح التلقائي وحفظ الكلمات المدخلة في قاموس المستخدم، مما يمنع تسرب كلمة المرور عبر ميزات الإدخال التنبؤي.
كما تقوم لوحة مفاتيح Password بتعطيل القدرة على التقاط لقطات شاشة لمحتوى الحقل (علامة FLAG_SECURE)، على الرغم من أن هذا السلوك يعتمد على تنفيذ لوحة المفاتيح المحددة. بدءًا من Android 8.0 (API 26)، تدعم لوحات مفاتيح كلمة المرور الملء التلقائي عبر مديري كلمات المرور إذا تم تعيين السمة importantForAutofill="yes".
وفقًا لـ Android Security Recommendations (2025)، لحقول كلمة المرور يُوصى أيضًا: بتعيين maxLength لمنع كلمات المرور الطويلة جدًا (التي قد تكون ناقل هجوم على قاعدة البيانات)، واستخدام inputType="textPassword" مع TextInputLayout وendIconMode="password_toggle" ليتمكن المستخدم من التحقق من كلمة المرور المدخلة قبل إرسال النموذج.
<!-- Password field with show/hide icon -->
@+id/tilPasswordField
app:endIconMode="password_toggle">
@+id/etPasswordField
android:inputType="textPassword"
android:maxLength="64"
android:importantForAutofill="yes" />
</com.google.android.material.textfield.TextInputLayout>
يسمح الإعداد البرمجي لـ Keyboard Type بتغيير وضع لوحة المفاتيح ديناميكيًا حسب السياق أو إدخال المستخدم. على سبيل المثال، عند تبديل نوع الحقل (نص/رقم/تاريخ) أو عند تغيير الإعدادات المحلية. تقبل طريقة setInputType() قناع بت InputType وتقوم بتحديث لوحة المفاتيح فورًا إذا كان الحقل في حالة التركيز.
// التبديل بين الإدخال النصي والرقمي
fun switchInputType(field: EditText, isNumeric: Boolean) {
field.inputType = if (isNumeric) {
InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
}
field.setSelection(field.text.length)
}
// التحقق مما إذا كان الحقل رقميًا
fun isNumericInput(field: EditText): Boolean {
val type = field.inputType
return (type and InputType.TYPE_MASK_CLASS) ==
InputType.TYPE_CLASS_NUMBER
}
// التحقق مما إذا كان التصحيح التلقائي مفعلًا
fun isAutoCorrectEnabled(field: EditText): Boolean {
return (field.inputType and
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT) != 0
}
الأسئلة الشائعة
إذا لم يتم تحديد inputType، يستخدم EditText افتراضيًا TYPE_CLASS_TEXT مع علامة TYPE_TEXT_FLAG_MULTI_LINE. هذا يعني لوحة مفاتيح QWERTY قياسية وإدخال متعدد الأسطر. لمعظم الحقول، يُوصى بتحديد inputType صراحة لضمان سلوك لوحة المفاتيح الصحيح وتصفية الأحرف.
استخدم السمة android:imeOptions="actionDone" على EditText. سيؤدي هذا إلى استبدال زر الإدخال بزر تم. خيارات أخرى: actionSearch (عدسة مكبرة)، actionNext (سهم يمين)، actionSend (إرسال). قم بمعالجة الضغط عبر OnEditorActionListener في الكود.
لا يمكن تعطيل الاهتزاز لحقل معين — إنه إعداد نظام يتحكم فيه المستخدم في إعدادات لوحة المفاتيح. ومع ذلك، يمكنك منع ظهور لوحة المفاتيح بالكامل عن طريق تعيين السمة android:focusable="false" على EditText أو عن طريق إلغاء العرض عبر dispatchTouchEvent.
قم بتعيين android:inputType="none" أو استدع برمجيًا editText.setKeyListener(null). سيعرض الحقل النص، لكن لوحة المفاتيح لن تظهر عند التركيز. سيتمكن المستخدم من تحديد النص ونسخه، ولكن ليس تحريره. البديل هو استخدام TextView مع textIsSelectable="true".
بعد استدعاء setInputType()، تحتاج إلى إظهار لوحة المفاتيح مرة أخرى، لأن النظام قد لا يقوم بتحديث IME تلقائيًا. استدع InputMethodManager.restartInput(view) لفرض التحديث. إذا لم يكن الحقل في حالة التركيز، استدع requestFocus() أولاً، ثم restartInput.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.