إنشاء أسلوب إدخال

محرّر أسلوب الإدخال (IME) هو عنصر تحكّم يتيح للمستخدمين إدخال نص. يوفر Android إطار عمل قابلاً للتوسيع لأسلوب الإدخال يتيح للتطبيقات تزويد المستخدمين بطرق إدخال بديلة، مثل لوحات المفاتيح على الشاشة أو الإدخال الصوتي. بعد تثبيت محرّرات أسلوب الإدخال، يمكن للمستخدم اختيار أحدها من إعدادات النظام واستخدامه على مستوى النظام بأكمله. لا يمكن تفعيل أداة IME واحدة فقط في آن واحد.

لإضافة محرّر أسلوب إدخال إلى نظام Android، عليك إنشاء تطبيق Android يحتوي على فئة توسّع InputMethodService. بالإضافة إلى ذلك، عليك عادةً إنشاء نشاط "إعدادات" يمرِّر الخيارات إلى خدمة محرّر أسلوب الإدخال. يمكنك أيضًا تحديد واجهة مستخدم للإعدادات تظهر كجزء من إعدادات النظام.

تتناول هذه الصفحة المواضيع التالية:

إذا لم يسبق لك العمل مع محرّرات أسلوب الإدخال، يُرجى قراءة المقالة التمهيدية طرق الإدخال على الشاشة أولاً.

دورة حياة محرّر أسلوب الإدخال

يصف المخطّط البياني التالي مراحل النشاط لأداة IME:

صورة تعرض دورة حياة محرر طريقة إدخال.
الشكل 1. مراحل نشاط محرّر أسلوب الإدخال

توضّح الأقسام التالية كيفية تنفيذ واجهة المستخدم والرمز البرمجي المرتبطَين بأداة IME تتّبع مراحل النشاط هذه.

الإعلان عن مكوّنات محرّر أسلوب الإدخال في البيان

في نظام Android، محرّر أسلوب الإدخال هو تطبيق Android يحتوي على خدمة خاصة لمحرّر أسلوب الإدخال. يجب أن يعلن ملف بيان التطبيق عن الخدمة، ويطلب الأذونات اللازمة، ويقدّم فلتر أهداف يطابق الإجراء action.view.InputMethod، ويقدّم بيانات وصفية تحدّد خصائص محرّر أسلوب الإدخال. بالإضافة إلى ذلك، لتوفير واجهة إعدادات تتيح للمستخدم تعديل سلوك أداة IME، يمكنك تحديد نشاط "إعدادات" يمكن تشغيله من "إعدادات النظام".

يعلن المقتطف التالي عن خدمة محرّر أسلوب الإدخال. يطلب الإذن BIND_INPUT_METHOD للسماح للخدمة بربط محرّر أسلوب الإدخال بالنظام، ويضبط فلتر أهداف يطابق الإجراء android.view.InputMethod، ويحدّد البيانات الوصفية لمحرّر أسلوب الإدخال:

<!-- Declares the input method service. -->
<service android:name="FastInputIME"
    android:label="@string/fast_input_label"
    android:permission="android.permission.BIND_INPUT_METHOD">
    <intent-filter>
        <action android:name="android.view.InputMethod" />
    </intent-filter>
    <meta-data android:name="android.view.im"
               android:resource="@xml/method" />
</service>

يعلن المقتطف التالي عن نشاط الإعدادات لمحرّر أسلوب الإدخال. يحتوي على فلتر أهداف لـ ACTION_MAIN يشير إلى أنّ هذا النشاط هو نقطة الدخول الرئيسية لتطبيق محرّر أسلوب الإدخال:

<!-- Optional: an activity for controlling the IME settings. -->
<activity android:name="FastInputIMESettings"
    android:label="@string/fast_input_settings">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
    </intent-filter>
</activity>

يمكنك أيضًا توفير إمكانية الوصول إلى إعدادات محرّر أسلوب الإدخال مباشرةً من واجهة المستخدم.

واجهة برمجة التطبيقات لأسلوب الإدخال

يمكن العثور على الفئات الخاصة بمحرّرات أسلوب الإدخال في حزمتَي android.inputmethodservice وandroid.view.inputmethod. تُعدّ فئة KeyEvent مهمة للتعامل مع أحرف لوحة المفاتيح.

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

الفئات التالية مهمة أيضًا:

BaseInputConnection
تحدّد قناة الاتصال من InputMethod إلى التطبيق الذي يتلقّى إدخالاته. يمكنك استخدامها لقراءة النص حول الـ مؤشر، وإرسال النص إلى مربّع النص، وإرسال أحداث المفاتيح الأولية إلى التطبيق. يجب أن توسّع التطبيقات هذه الفئة بدلاً من تنفيذ الواجهة الأساسية InputConnection.
KeyboardView
هي إضافة إلى View التي تعرض لوحة مفاتيح وتستجيب لأحداث بيانات أدخلها المستخدم. يتم تحديد تنسيق لوحة المفاتيح من خلال مثيل Keyboard, الذي يمكنك تحديده في ملف XML.

تصميم واجهة مستخدم أسلوب الإدخال

هناك عنصران مرئيان رئيسيان لمحرّر أسلوب الإدخال: طريقة عرض الإدخال وطريقة عرض الاقتراحات. عليك فقط تنفيذ العناصر ذات الصلة بطريقة الإدخال التي تصمّمها.

طريقة عرض الإدخال

طريقة عرض الإدخال هي واجهة المستخدم التي يُدخل فيها المستخدم نصًا على شكل نقرات على المفاتيح أو الكتابة بخط اليد أو إيماءات. عندما يظهر محرّر أسلوب الإدخال للمرة الأولى، يستدعي النظام عملية ردّ الاتصال onCreateInputView(). في عملية تنفيذ هذه الطريقة، عليك إنشاء التنسيق الذي تريد عرضه في نافذة محرّر أسلوب الإدخال وإرجاع التنسيق إلى النظام. يوضّح المقتطف التالي مثالاً على تنفيذ الطريقة onCreateInputView():

Kotlin

override fun onCreateInputView(): View {
    return layoutInflater.inflate(R.layout.input, null).apply {
        if (this is MyKeyboardView) {
            setOnKeyboardActionListener(this@MyInputMethod)
            keyboard = latinKeyboard
        }
    }
}

Java

@Override
public View onCreateInputView() {
    MyKeyboardView inputView =
        (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null);

    inputView.setOnKeyboardActionListener(this);
    inputView.setKeyboard(latinKeyboard);

    return inputView;
}

في هذا المثال، MyKeyboardView هو مثيل لتنفيذ مخصّص لـ KeyboardView يعرض Keyboard.

طريقة عرض الاقتراحات

طريقة عرض الاقتراحات هي واجهة المستخدم التي يعرض فيها محرّر أسلوب الإدخال تصحيحات محتملة للكلمات أو اقتراحات ليختارها المستخدم. في دورة حياة محرّر أسلوب الإدخال، يستدعي النظام onCreateCandidatesView() عندما يكون جاهزًا لعرض طريقة عرض الاقتراحات. في عملية تنفيذ هذه الطريقة، عليك إرجاع تنسيق يعرض اقتراحات الكلمات، أو إرجاع قيمة فارغة إذا كنت لا تريد عرض أي شيء. الردّ الفارغ هو السلوك التلقائي، لذا ليس عليك تنفيذ هذه الطريقة إذا كنت لا تقدّم اقتراحات.

اعتبارات تصميم واجهة المستخدم

يوضّح هذا القسم بعض الاعتبارات المتعلقة بتصميم واجهة المستخدم لمحرّرات أسلوب الإدخال.

التعامل مع أحجام الشاشات المتعددة

يجب أن تكون واجهة مستخدم محرّر أسلوب الإدخال قابلة للتكيّف مع أحجام الشاشات المختلفة والتعامل مع كل من الوضعَين الأفقي والعمودي. في وضع محرّر أسلوب الإدخال غير ملء الشاشة، عليك ترك مساحة كافية للتطبيق لعرض حقل النص وأي سياق مرتبط به، بحيث لا يشغل محرّر أسلوب الإدخال أكثر من نصف الشاشة. في وضع محرّر أسلوب الإدخال بملء الشاشة، لا يمثّل ذلك مشكلة.

التعامل مع أنواع الإدخال المختلفة

تتيح لك حقول نص Android ضبط نوع إدخال معيّن، مثل النص الحر والأرقام وعناوين URL وعناوين البريد الإلكتروني وعبارات البحث. عند تنفيذ محرّر أسلوب إدخال جديد، عليك رصد نوع الإدخال لكل حقل وتوفير الواجهة المناسبة له. ومع ذلك، ليس عليك إعداد أداة IME للتحقّق مما إذا كان المستخدم يُدخل نصًا صالحًا لنوع الإدخال. هذه مسؤولية التطبيق الذي يملك حقل النص.

على سبيل المثال، إليك الواجهة التي يوفّرها محرّر أسلوب الإدخال اللاتيني لإدخال النص في نظام Android الأساسي:

صورة تعرض إدخال نص على محرر أسلوب إدخال لاتيني
الشكل 2. إدخال النص في محرّر أسلوب الإدخال اللاتيني

إليك الواجهة التي يوفّرها محرّر أسلوب الإدخال اللاتيني لإدخال الأرقام في نظام Android الأساسي:

صورة تعرض إدخالاً رقميًا على محرر أسلوب إدخال لاتيني
الشكل 3. إدخال الأرقام في محرّر أسلوب الإدخال اللاتيني

عندما يركّز المستخدم على حقل إدخال ويبدأ محرّر أسلوب الإدخال، يستدعي النظام onStartInputView()، مع تمرير عنصر EditorInfo يحتوي على تفاصيل حول نوع الإدخال وسمات أخرى لحقل النص. في هذا العنصر، يحتوي حقل inputType على نوع الإدخال لحقل النص.

حقل inputType هو int يحتوي على أنماط بت لإعدادات أنواع الإدخال المختلفة. لاختباره لنوع الإدخال في حقل النص، عليك إخفاءه باستخدام الثابت TYPE_MASK_CLASS، على النحو التالي:

Kotlin

inputType and InputType.TYPE_MASK_CLASS

Java

inputType & InputType.TYPE_MASK_CLASS

يمكن أن يحتوي نمط بت نوع الإدخال على إحدى القيم التالية، بما في ذلك:

TYPE_CLASS_NUMBER
حقل نص لإدخال الأرقام كما هو موضّح في الشكل 3، يعرض محرّر أسلوب الإدخال اللاتيني لوحة أرقام لحقول هذا النوع.
TYPE_CLASS_DATETIME
حقل نص لإدخال التاريخ والوقت
TYPE_CLASS_PHONE
حقل نص لإدخال أرقام الهواتف
TYPE_CLASS_TEXT
حقل نص لإدخال أي أحرف متوافقة

يتم وصف هذه الثوابت بمزيد من التفصيل في المستندات المرجعية لـ InputType.

يمكن أن يحتوي حقل inputType على بتات أخرى تشير إلى شكل مختلف من نوع حقل النص، مثل:

TYPE_TEXT_VARIATION_PASSWORD
شكل مختلف من TYPE_CLASS_TEXT لإدخال كلمات المرور يعرض أسلوب الإدخال رموزًا بدلاً من النص الفعلي.
TYPE_TEXT_VARIATION_URI
صيغة من TYPE_CLASS_TEXT لإدخال عناوين URL للويب ومعرّفات الموارد المنتظمة (URI) الأخرى.
TYPE_TEXT_FLAG_AUTO_COMPLETE
صيغة من TYPE_CLASS_TEXT لإدخال نص يكمل التطبيق تلقائيًا من قاموس أو بحث أو ميزة أخرى

عليك إخفاء inputType باستخدام الثابت المناسب عند اختبار هذه الأشكال المختلفة. يتم إدراج ثوابت الإخفاء المتاحة في المستندات المرجعية لـ InputType.

إرسال نص إلى التطبيق

أثناء إدخال المستخدم نصًا باستخدام أداة IME، يمكنك إرسال نص إلى التطبيق من خلال إرسال أحداث مفاتيح فردية أو من خلال تعديل النص حول المؤشر في حقل النص الخاص بالتطبيق. في كلتا الحالتَين، عليك استخدام مثيل InputConnection لتسليم النص. للحصول على هذا المثيل، عليك استدعاء InputMethodService.getCurrentInputConnection().

تعديل النص حول المؤشر

عند التعامل مع تعديل النص الحالي، إليك بعض الطرق المفيدة في BaseInputConnection:

getTextBeforeCursor()
تعرض CharSequence تحتوي على عدد الأحرف المطلوبة قبل موضع المؤشر الحالي.
getTextAfterCursor()
تعرض CharSequence تحتوي على عدد الأحرف المطلوبة بعد موضع المؤشر الحالي.
deleteSurroundingText()
تحذف العدد المحدّد من الأحرف قبل موضع المؤشر الحالي وبعده.
commitText()
تُرسِل CharSequence إلى حقل النص وتضبط موضع مؤشر جديدًا.

على سبيل المثال، يوضّح المقتطف التالي كيفية استبدال الأحرف الأربعة على يسار المؤشر بالنص "Hello!":

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.deleteSurroundingText(4, 0)
    ic.commitText("Hello", 1)
    ic.commitText("!", 1)
}

Java

InputConnection ic = getCurrentInputConnection();
ic.deleteSurroundingText(4, 0);
ic.commitText("Hello", 1);
ic.commitText("!", 1);

السماح بإنشاء النص قبل إرساله

إذا كان محرّر أسلوب الإدخال يتوقّع نصًا أو يتطلّب عدة خطوات لإنشاء حرف رسومي أو كلمة، يمكنك عرض التقدّم في حقل النص إلى أن يُرسِل المستخدم الكلمة، ثم يمكنك استبدال النص الذي تم إنشاؤه جزئيًا بالنص المكتمل. يمكنك منح النص معاملة خاصة من خلال إضافة نطاق إليه عند تمريره إلى setComposingText().

يوضّح المقتطف التالي كيفية عرض التقدّم في حقل نص:

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.setComposingText("Composi", 1)
    ic.setComposingText("Composin", 1)
    ic.commitText("Composing ", 1)
}

Java

InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);

اعتراض أحداث المفاتيح الخارجية

على الرغم من أنّ نافذة أسلوب الإدخال لا تركّز بشكل صريح، فإنّها تتلقّى أحداث المفاتيح الخارجية أولاً ويمكنها استخدامها أو إعادة توجيهها إلى التطبيق. على سبيل المثال، قد تريد استخدام مفاتيح الاتجاه للتنقّل داخل واجهة المستخدم لاختيار الاقتراحات أثناء الإنشاء. قد تريد أيضًا اعتراض مفتاح الرجوع لإغلاق أي مربّعات حوار تنشأ من نافذة أسلوب الإدخال.

لاعتراض المفاتيح الخارجية، عليك إلغاء onKeyDown() وonKeyUp().

عليك استدعاء طريقة super() للمفاتيح التي لا تريد التعامل معها بنفسك.

إنشاء نوع فرعي لمحرّر أسلوب الإدخال

تتيح الأنواع الفرعية لأداة IME عرض أوضاع إدخال ولغات متعددة متوافقة مع أداة IME. يمكن أن يمثّل النوع الفرعي ما يلي:

  • لغة، مثل en_US أو fr_FR
  • وضع إدخال، مثل الصوت أو لوحة المفاتيح أو الكتابة بخط اليد
  • أنماط أو أشكال أو خصائص إدخال أخرى خاصة بمحرّر أسلوب الإدخال، مثل تنسيقات لوحة المفاتيح ذات 10 مفاتيح أو QWERTY

يمكن أن يكون الوضع أي نص، مثل "لوحة المفاتيح" أو "الصوت". يمكن أن يعرض النوع الفرعي أيضًا مجموعة من هذه الخيارات.

تُستخدم معلومات النوع الفرعي لمربّع حوار تبديل محرّر أسلوب الإدخال المتاح من شريط الإشعارات ولإعدادات محرّر أسلوب الإدخال. تتيح هذه المعلومات أيضًا للإطار إظهار نوع فرعي معيّن من محرّر أسلوب الإدخال مباشرةً. عند إنشاء محرّر أسلوب إدخال، عليك استخدام ميزة النوع الفرعي، لأنّها تساعد المستخدم في تحديد لغات وأوضاع محرّر أسلوب الإدخال المختلفة والتبديل بينها.

عليك تحديد الأنواع الفرعية في أحد ملفات موارد XML الخاصة بأسلوب الإدخال، باستخدام العنصر <subtype>. يحدّد مقتطف الرمز البرمجي التالي أداة IME بنوعَين فرعيَين: نوع فرعي للوحة المفاتيح للغة الإنجليزية في الولايات المتحدة ونوع فرعي آخر للوحة المفاتيح للغة الفرنسية في فرنسا:

<input-method xmlns:android="http://schemas.android.com/apk/res/android"
        android:settingsActivity="com.example.softkeyboard.Settings"
        android:icon="@drawable/ime_icon">
    <subtype android:name="@string/display_name_english_keyboard_ime"
            android:icon="@drawable/subtype_icon_english_keyboard_ime"
            android:languageTag="en-US"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="somePrivateOption=true" />
    <subtype android:name="@string/display_name_french_keyboard_ime"
            android:icon="@drawable/subtype_icon_french_keyboard_ime"
            android:languageTag="fr-FR"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" />
    <subtype android:name="@string/display_name_german_keyboard_ime" ... />
</input-method>

للتأكّد من تصنيف الأنواع الفرعية بشكل صحيح في واجهة المستخدم، عليك استخدام `%s` للحصول على تصنيف نوع فرعي مطابق لتصنيف اللغة للنوع الفرعي. يتم توضيح ذلك في مقتطفَي الرمز البرمجي التاليَين. يعرض المقتطف الأول جزءًا من ملف XML الخاص بأسلوب الإدخال:

<subtype
    android:label="@string/label_subtype_generic"
    android:imeSubtypeLocale="en_US"
    android:icon="@drawable/icon_en_us"
    android:imeSubtypeMode="keyboard" />

المقتطف التالي هو جزء من ملف strings.xml الخاص بمحرّر أسلوب الإدخال. تم تحديد مورد السلاسل النصية label_subtype_generic، الذي تستخدمه تعريف واجهة مستخدم أسلوب الإدخال لضبط تصنيف النوع الفرعي، على النحو التالي:

<string name="label_subtype_generic">%s</string>

يؤدي هذا الإعداد إلى مطابقة اسم العرض للنوع الفرعي مع إعداد اللغة. على سبيل المثال، في أي لغة إنجليزية، يكون اسم العرض "الإنجليزية (الولايات المتحدة)".

اختيار الأنواع الفرعية لأداة IME من شريط الإشعارات

يدير نظام Android جميع الأنواع الفرعية التي تعرضها جميع محرّرات أسلوب الإدخال. تُعامَل الأنواع الفرعية لأداة IME على أنّها أوضاع لأداة IME التي تنتمي إليها. يمكن للمستخدم الانتقال من شريط الإشعارات أو تطبيق "الإعدادات" إلى قائمة بالأنواع الفرعية المتاحة لمحرّر أسلوب الإدخال، كما هو موضّح في الشكل التالي:

صورة تعرض قائمة &quot;النظام&quot; في &quot;اللغات والإدخال&quot;
الشكل 4. قائمة النظام اللغات والإدخال

اختيار الأنواع الفرعية لأداة IME من "إعدادات النظام"

يمكن للمستخدم أيضًا التحكّم في كيفية استخدام الأنواع الفرعية في لوحة إعدادات اللغة والإدخال في إعدادات النظام:

صورة تعرض قائمة اختيار اللغات
الشكل 5. قائمة النظام اللغات

التبديل بين الأنواع الفرعية لمحرّر أسلوب الإدخال

يمكنك السماح للمستخدمين بالتبديل بسهولة بين الأنواع الفرعية لأداة IME من خلال توفير مفتاح تبديل، مثل رمز اللغة على شكل كرة أرضية على لوحة المفاتيح. يؤدي ذلك إلى تحسين سهولة استخدام لوحة المفاتيح ويوفر الراحة للمستخدم. لتفعيل هذا التبديل، عليك اتّباع الخطوات التالية:

  1. عليك الإعلان عن supportsSwitchingToNextInputMethod = "true" في ملفات موارد XML الخاصة بأسلوب الإدخال. يجب أن يبدو الإعلان مشابهًا لمقتطف الرمز البرمجي التالي:
    <input-method xmlns:android="http://schemas.android.com/apk/res/android"
            android:settingsActivity="com.example.softkeyboard.Settings"
            android:icon="@drawable/ime_icon"
            android:supportsSwitchingToNextInputMethod="true">
  2. عليك استدعاء الطريقة shouldOfferSwitchingToNextInputMethod().
  3. إذا كانت الطريقة تعرض "صحيح"، عليك عرض مفتاح تبديل.
  4. عندما ينقر المستخدم على مفتاح التبديل، عليك استدعاء switchToNextInputMethod(), مع تمرير "خطأ". تشير القيمة "خطأ" إلى النظام للتعامل مع جميع الأنواع الفرعية على قدم المساواة، بغض النظر عن محرّر أسلوب الإدخال الذي تنتمي إليه. يتطلّب تحديد "صحيح" من النظام الانتقال بالتناوب بين الأنواع الفرعية في الـ محرّر أسلوب الإدخال الحالي.

اعتبارات عامة لمحرّر أسلوب الإدخال

إليك بعض النقاط الأخرى التي يجب وضعها في الاعتبار أثناء تنفيذ أداة IME:

  • عليك توفير طريقة للمستخدمين لضبط الخيارات مباشرةً من واجهة مستخدم محرّر أسلوب الإدخال.
  • عليك توفير طريقة للمستخدمين للتبديل إلى محرّر أسلوب إدخال مختلف مباشرةً من واجهة مستخدم أسلوب الإدخال، لأنّه قد يتم تثبيت محرّرات أسلوب إدخال متعددة على الجهاز.
  • عليك إظهار واجهة مستخدم محرّر أسلوب الإدخال بسرعة. عليك التحميل المسبق لأي موارد كبيرة أو تحميلها عند الطلب حتى يرى المستخدمون محرّر أسلوب الإدخال بمجرد النقر على حقل نص. عليك تخزين الموارد وطرق العرض مؤقتًا للاستدعاءات اللاحقة لأسلوب الإدخال.
  • عليك تحرير عمليات تخصيص الذاكرة الكبيرة فور إخفاء نافذة أسلوب الإدخال، حتى يكون لدى التطبيقات ذاكرة كافية للتشغيل. استخدِم رسالة مؤجّلة لتحرير الموارد إذا تم إخفاء محرّر أسلوب الإدخال لبضع ثوانٍ.
  • عليك التأكّد من أنّه يمكن للمستخدمين إدخال أكبر عدد ممكن من الأحرف للغة أو اللغة المرتبطة بأداة IME. قد يستخدم المستخدمون علامات الترقيم في كلمات المرور أو أسماء المستخدمين، لذا يجب أن يوفّر محرّر أسلوب الإدخال العديد من الأحرف المختلفة للسماح للمستخدمين بإدخال كلمة مرور والوصول إلى الجهاز.