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

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

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

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

إذا لم يسبق لك استخدام تقنيات IME، اطّلِع على المقالة التمهيدية طرق الإدخال على الشاشة أولاً.

مراحل نشاط أداة IME

يوضِّح المخطّط التالي دورة حياة أداة IME:

صورة تعرض دورة حياة أداة IME.
الشكل 1. دورة حياة واجهة برمجة التطبيقات لمعالجة النصوص

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

الإفصاح عن مكوّنات IME في البيان

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

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

<!-- 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>

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

<!-- 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>

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

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

يمكن العثور على الصفوف الخاصة بخدمات IME في الحِزم android.inputmethodservice و android.view.inputmethod . صف KeyEvent مهم لمعالجة أحرف لوحة المفاتيح.

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

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

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

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

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

عرض الإدخال

طريقة عرض الإدخال هي واجهة المستخدم التي يُدخل فيها المستخدم نصًا في شكل نقرات على المفتاح أو الكتابة بخط اليد أو الإيماءات. عند عرض IME للمرة الأولى، يستدعي النظام onCreateInputView() دالة الاستدعاء. عند تنفيذ هذه الطريقة، أنشئ التنسيق الذي تريد عرضه في نافذة IME وأرِد التنسيق إلى النظام. يعرض المقتطف التالي مثالاً على تنفيذ طريقة 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.

عرض المرشحين

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

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

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

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

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

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

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

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

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

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

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

عندما يتلقّى حقل إدخال التركيز ويبدأ IME، يُطلِق النظام 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، يعرض أداة IME باللغة اللاتينية لوحة أرقام للحقول من هذا النوع.
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 إلى حقل النص وتضبط موضعًا جديدًا للمؤشر.

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

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);

دعم تأليف النص قبل الالتزام

إذا كان أسلوب إدخال النص التلقائي يتوقّع النص أو يتطلّب خطوات متعدّدة لإنشاء رمز أو كلمة، يمكنك عرض مستوى التقدّم في حقل النص إلى أن يُدخل المستخدم الكلمة، ثم يمكنك استبدال التكوين الجزئي بالنص المكتمل. يمكنك التعامل بشكل خاص مع النص عن طريق إضافة span عند تمريره إلى 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
  • وضع إدخال، مثل الصوت أو لوحة المفاتيح أو الكتابة بخط اليد
  • أنماط إدخال أو نماذج أو خصائص إدخال أخرى خاصة بأداة IME، مثل 10-key أو QWERTY تنسيقات لوحة المفاتيح

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

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

حدد الأنواع الفرعية لأحد ملفات موارد 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 لنظام معالجة النصوص (IME). يتم تعريف مورد السلسلة label_subtype_generic، الذي يستخدمه تعريف واجهة مستخدم طريقة الإدخال لضبط علامة النوع الفرعي، على النحو التالي:

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

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

اختيار أنواع تطبيقات تحسين الكتابة من شريط الإشعارات

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

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

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

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

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

التبديل بين الأنواع الفرعية لنظام IME

يمكنك السماح للمستخدمين بالتبديل بسهولة بين الأنواع الفرعية لأداة 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()، وتمريره خطأ. تُشير القيمة false إلى النظام على التعامل مع جميع الأنواع الفرعية بالتساوي، بغض النظر عن نوع IME الذي تنتمي إليه. يتطلب تحديد true أن ينتقل النظام بين الأنواع الفرعية في لوحة IME الحالية.

اعتبارات عامة حول أدوات IME

في ما يلي بعض النقاط الأخرى التي يجب مراعاتها عند تنفيذ IME:

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