ویرایشگر روش ورودی (IME) یک کنترل کاربر است که به کاربران اجازه می دهد متن را وارد کنند. Android یک چارچوب روش ورودی توسعهیافته ارائه میکند که به برنامهها اجازه میدهد روشهای ورودی جایگزینی مانند صفحهکلید روی صفحه یا ورودی گفتار را در اختیار کاربران قرار دهند. پس از نصب IME ها، کاربر می تواند یکی از تنظیمات سیستم را انتخاب کرده و در کل سیستم استفاده کند. فقط یک IME را می توان در یک زمان فعال کرد.
برای افزودن یک IME به سیستم Android، یک برنامه Android حاوی کلاسی ایجاد کنید که InputMethodService
گسترش دهد. علاوه بر این، شما معمولاً یک فعالیت "تنظیمات" ایجاد می کنید که گزینه ها را به سرویس IME منتقل می کند. همچنین می توانید رابط کاربری تنظیماتی را که به عنوان بخشی از تنظیمات سیستم نمایش داده می شود، تعریف کنید.
این صفحه موضوعات زیر را پوشش می دهد:
- چرخه حیات IME
- اعلان اجزای IME در مانیفست برنامه
- IME API
- طراحی رابط کاربری IME
- ارسال متن از یک IME به یک برنامه
- کار با زیرگروه های IME
- سایر ملاحظات IME
اگر با IME کار نکردهاید، ابتدا مقاله مقدماتی روشهای ورودی روی صفحه را بخوانید.
چرخه حیات IME
نمودار زیر چرخه حیات یک IME را شرح می دهد:

بخشهای زیر نحوه پیادهسازی UI و کد مرتبط با یک IME را که از این چرخه حیات پیروی میکند، توضیح میدهد.
اجزای IME را در مانیفست اعلام کنید
در سیستم اندروید، IME یک برنامه اندرویدی است که شامل یک سرویس ویژه 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 دسترسی داشته باشید.
API روش ورودی
کلاسهای مخصوص IME در بستههای android.inputmethodservice
و android.view.inputmethod
یافت میشوند. کلاس KeyEvent
برای مدیریت کاراکترهای صفحه کلید مهم است.
بخش مرکزی یک IME یک جزء سرویس است - کلاسی که InputMethodService
گسترش می دهد. این کلاس علاوه بر پیادهسازی چرخه عمر سرویس عادی، برای ارائه رابط کاربری IME شما، مدیریت ورودی کاربر و تحویل متن به فیلدی که فوکوس دارد، تماسهایی نیز دارد. بهطور پیشفرض، کلاس InputMethodService
بیشتر پیادهسازی را برای مدیریت وضعیت و دید IME و برقراری ارتباط با فیلد ورودی فعلی ارائه میکند.
کلاس های زیر نیز مهم هستند:
-
BaseInputConnection
- کانال ارتباطی را از یک
InputMethod
به برنامهای که ورودی آن را دریافت میکند، تعریف میکند. شما از آن برای خواندن متن در اطراف مکان نما، ارسال متن به جعبه متن و ارسال رویدادهای کلید خام به برنامه استفاده می کنید. برنامه ها باید این کلاس را به جای پیاده سازی رابط پایهInputConnection
گسترش دهند. -
KeyboardView
- یک برنامه افزودنی از
View
که صفحه کلید را رندر می کند و به رویدادهای ورودی کاربر پاسخ می دهد. چیدمان صفحه کلید توسط نمونه ای ازKeyboard
مشخص می شود که می توانید آن را در یک فایل XML تعریف کنید.
UI روش ورودی را طراحی کنید
دو عنصر بصری اصلی برای یک IME وجود دارد: نمای ورودی و نمای کاندیدا . شما فقط باید عناصری را پیاده سازی کنید که با روش ورودی که طراحی می کنید مرتبط هستند.
نمای ورودی
نمای ورودی رابط کاربری است که در آن کاربر متن را به صورت کلیک کلید، دست خط یا اشاره وارد می کند. هنگامی که IME برای اولین بار نمایش داده می شود، سیستم onCreateInputView()
را فراخوانی می کند. در اجرای این روش، طرحی را که می خواهید در پنجره IME نمایش دهید ایجاد کنید و طرح را به سیستم برگردانید. قطعه زیر نمونه ای از پیاده سازی متد onCreateInputView()
نشان می دهد:
کاتلین
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
جاوا
@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()
فرا می خواند. در اجرای این روش، طرحی را برگردانید که پیشنهادات کلمه را نشان می دهد، یا اگر نمی خواهید چیزی نشان داده شود، null را برگردانید. پاسخ تهی رفتار پیشفرض است، بنابراین در صورت عدم ارائه پیشنهاد، نیازی به اجرای آن ندارید.
ملاحظات طراحی رابط کاربری
این بخش برخی از ملاحظات طراحی UI برای IME ها را شرح می دهد.
اندازه های صفحه نمایش متعدد را مدیریت کنید
UI برای IME شما باید بتواند برای اندازه های مختلف صفحه نمایش مقیاس بندی کند و هم جهت افقی و هم عمودی را مدیریت کند. در حالت IME غیر تمام صفحه، فضای کافی برای برنامه برای نمایش فیلد متن و هر زمینه مرتبط با آن بگذارید، به طوری که بیش از نیمی از صفحه توسط IME اشغال نشود. در حالت تمام صفحه IME، این یک مشکل نیست.
انواع مختلف ورودی را مدیریت کنید
فیلدهای متنی Android به شما امکان می دهد نوع ورودی خاصی مانند متن آزاد، اعداد، URL ها، آدرس های ایمیل و رشته های جستجو را تنظیم کنید. هنگامی که یک IME جدید را پیاده سازی می کنید، نوع ورودی هر فیلد را شناسایی کرده و رابط مناسب را برای آن فراهم کنید. با این حال، لازم نیست IME خود را تنظیم کنید تا بررسی کنید آیا کاربر متن معتبری را برای نوع ورودی وارد می کند یا خیر. این مسئولیت بر عهده برنامه ای است که دارای فیلد متنی است.
به عنوان مثال، در اینجا رابطی است که IME لاتین برای ورودی متن پلت فرم اندروید ارائه می کند:

و اینجا رابطی است که IME لاتین برای ورودی عددی پلتفرم اندروید ارائه می کند:

وقتی یک فیلد ورودی فوکوس دریافت میکند و IME شما شروع میشود، سیستم onStartInputView()
را فراخوانی میکند و یک شی EditorInfo
را ارسال میکند که حاوی جزئیات مربوط به نوع ورودی و سایر ویژگیهای فیلد متنی است. در این شی، فیلد inputType
شامل نوع ورودی فیلد متنی است.
فیلد inputType
یک int
است که شامل الگوهای بیت برای تنظیمات مختلف نوع ورودی است. برای آزمایش آن برای نوع ورودی فیلد متن، آن را با ثابت TYPE_MASK_CLASS
ماسک کنید، مانند این:
کاتلین
inputType and InputType.TYPE_MASK_CLASS
جاوا
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
برای وارد کردن رمزهای عبور. روش ورودی، dingbats را به جای متن واقعی نمایش می دهد. -
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!" جایگزین کنید:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
از نوشتن متن قبل از ارتکاب پشتیبانی کنید
اگر IME شما متن را پیشبینی میکند یا برای نوشتن یک علامت یا کلمه به چندین مرحله نیاز دارد، میتوانید پیشرفت را در قسمت متن نشان دهید تا زمانی که کاربر کلمه را متعهد کند و سپس میتوانید ترکیب جزئی را با متن تکمیلشده جایگزین کنید. وقتی متن را به setComposingText()
میفرستید، میتوانید با افزودن یک span به متن، رفتار خاصی را به آن بدهید.
قطعه زیر نحوه نمایش پیشرفت در یک فیلد متنی را نشان می دهد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
رهگیری رویدادهای کلیدی سخت افزاری
اگرچه پنجره روش ورودی فوکوس واضحی ندارد، ابتدا رویدادهای کلیدی سخت افزاری را دریافت می کند و می تواند آنها را مصرف کند یا به برنامه ارسال کند. به عنوان مثال، ممکن است بخواهید از کلیدهای جهت دار برای پیمایش در UI خود برای انتخاب نامزد در طول ترکیب استفاده کنید. همچنین ممکن است بخواهید کلید بازگشت را به دام بیاندازید تا هر گفتگوی منشأ گرفته از پنجره روش ورودی را رد کنید.
برای رهگیری کلیدهای سخت افزاری، onKeyDown()
و onKeyUp()
را لغو کنید.
متد super()
را برای کلیدهایی که نمی خواهید خودتان کنترل کنید، فراخوانی کنید.
یک زیرنوع IME ایجاد کنید
زیرگروهها به IME اجازه میدهند حالتها و زبانهای ورودی متعددی را که توسط یک IME پشتیبانی میشوند، نمایش دهد. یک زیرگروه می تواند نشان دهنده موارد زیر باشد:
- محلی، مانند en_US یا fr_FR
- یک حالت ورودی، مانند صدا، صفحه کلید، یا دست خط
- سایر سبکهای ورودی، فرمها یا ویژگیهای خاص IME، مانند طرحبندی صفحهکلید 10 کلیدی یا QWERTY
حالت می تواند هر متنی باشد، مانند "صفحه کلید" یا "صدا". یک زیرمجموعه همچنین میتواند ترکیبی از این موارد را نشان دهد.
اطلاعات نوع فرعی برای گفتگوی تعویض کننده IME که از نوار اعلان و تنظیمات IME در دسترس است استفاده می شود. این اطلاعات همچنین به چارچوب اجازه میدهد تا زیرنوع خاصی از یک IME را مستقیماً بیاورد. هنگامی که یک IME می سازید، از تسهیلات subtype استفاده کنید، زیرا به کاربر کمک می کند زبان ها و حالت های مختلف IME را شناسایی کرده و بین آنها سوئیچ کند.
با استفاده از عنصر <subtype>
، انواع فرعی را در یکی از فایل های منبع XML روش ورودی تعریف کنید. قطعه کد زیر یک 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>
برای اطمینان از اینکه زیرگروههای شما به درستی در UI برچسبگذاری شدهاند، از «%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
، که توسط تعریف UI روش ورودی برای تنظیم برچسب نوع فرعی استفاده میشود، به صورت زیر تعریف میشود:
<string name="label_subtype_generic">%s</string>
این تنظیم باعث می شود که نام نمایشی نوع فرعی با تنظیمات محلی مطابقت داشته باشد. به عنوان مثال، در هر زبان انگلیسی، نام نمایشی "English (ایالات متحده آمریکا)" است.
زیر انواع IME را از نوار اعلان انتخاب کنید
سیستم اندروید همه زیرشاخههای افشا شده توسط همه IMEها را مدیریت میکند. زیرگروه های IME به عنوان حالت های IME که به آن تعلق دارند در نظر گرفته می شوند. همانطور که در شکل زیر نشان داده شده است، کاربر می تواند از نوار اعلان یا برنامه تنظیمات به منوی زیرگروه های IME موجود پیمایش کند:

زیر انواع IME را از تنظیمات سیستم انتخاب کنید
کاربر همچنین میتواند نحوه استفاده از زیرگروهها را در پانل تنظیمات زبان و ورودی در تنظیمات سیستم کنترل کند:

جابهجایی بین زیرگروههای IME
میتوانید با ارائه یک کلید جابجایی، مانند نماد زبان کرهای روی صفحهکلید، به کاربران اجازه دهید به راحتی بین انواع فرعی IME جابجا شوند. این قابلیت استفاده از صفحه کلید را بهبود می بخشد و برای کاربر راحت است. برای فعال کردن این تغییر، مراحل زیر را انجام دهید:
- در فایل های منبع XML روش ورودی،
supportsSwitchingToNextInputMethod = "true"
را اعلام کنید. اعلان شما باید شبیه قطعه کد زیر باشد:<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">
- متد
shouldOfferSwitchingToNextInputMethod()
فراخوانی کنید. - اگر روش true را برگرداند، یک کلید سوئیچینگ نمایش دهید.
- هنگامی که کاربر روی کلید سوئیچینگ ضربه میزند،
switchToNextInputMethod()
را فراخوانی میکند که false است. مقدار false به سیستم میگوید که همه زیرگروهها را بدون در نظر گرفتن اینکه به کدام IME تعلق دارند، یکسان رفتار کند. تعیین true مستلزم چرخش سیستم در میان انواع فرعی در IME فعلی است.
ملاحظات عمومی IME
در اینجا موارد دیگری وجود دارد که باید هنگام پیاده سازی IME خود در نظر بگیرید:
- راهی برای کاربران فراهم کنید تا گزینهها را مستقیماً از رابط کاربری IME تنظیم کنند.
- راهی را برای کاربران فراهم کنید تا مستقیماً از رابط کاربری روش ورودی به IME دیگری تغییر کنند، زیرا ممکن است چندین IME روی دستگاه نصب شده باشد.
- رابط کاربری IME را به سرعت مطرح کنید. هر منبع بزرگی را از قبل بارگیری یا بارگیری کنید تا کاربران به محض ضربه زدن روی یک فیلد متن، IME را ببینند. منابع و نماهای کش برای فراخوانی های بعدی روش ورودی.
- بلافاصله پس از پنهان شدن پنجره روش ورودی، تخصیص حافظه بزرگ را آزاد کنید تا برنامه ها حافظه کافی برای اجرا داشته باشند. اگر IME برای چند ثانیه مخفی شد، از پیام تاخیری برای انتشار منابع استفاده کنید.
- اطمینان حاصل کنید که کاربران میتوانند تا حد ممکن نویسهها را برای زبان یا محلی مرتبط با IME وارد کنند. کاربران ممکن است از علائم نگارشی در گذرواژهها یا نامهای کاربری استفاده کنند، بنابراین IME شما باید کاراکترهای مختلفی را ارائه کند تا به کاربران اجازه دهد رمز عبور را وارد کرده و به دستگاه دسترسی داشته باشند.
ویرایشگر روش ورودی (IME) یک کنترل کاربر است که به کاربران اجازه می دهد متن را وارد کنند. Android یک چارچوب روش ورودی توسعهیافته ارائه میکند که به برنامهها اجازه میدهد روشهای ورودی جایگزینی مانند صفحهکلید روی صفحه یا ورودی گفتار را در اختیار کاربران قرار دهند. پس از نصب IME ها، کاربر می تواند یکی از تنظیمات سیستم را انتخاب کرده و در کل سیستم استفاده کند. فقط یک IME را می توان در یک زمان فعال کرد.
برای افزودن یک IME به سیستم Android، یک برنامه Android حاوی کلاسی ایجاد کنید که InputMethodService
گسترش دهد. علاوه بر این، شما معمولاً یک فعالیت "تنظیمات" ایجاد می کنید که گزینه ها را به سرویس IME منتقل می کند. همچنین می توانید رابط کاربری تنظیماتی را که به عنوان بخشی از تنظیمات سیستم نمایش داده می شود، تعریف کنید.
این صفحه موضوعات زیر را پوشش می دهد:
- چرخه حیات IME
- اعلان اجزای IME در مانیفست برنامه
- IME API
- طراحی رابط کاربری IME
- ارسال متن از یک IME به یک برنامه
- کار با زیرگروه های IME
- سایر ملاحظات IME
اگر با IME کار نکردهاید، ابتدا مقاله مقدماتی روشهای ورودی روی صفحه را بخوانید.
چرخه حیات IME
نمودار زیر چرخه حیات یک IME را شرح می دهد:

بخشهای زیر نحوه پیادهسازی UI و کد مرتبط با یک IME را که از این چرخه حیات پیروی میکند، توضیح میدهد.
اجزای IME را در مانیفست اعلام کنید
در سیستم اندروید، IME یک برنامه اندرویدی است که شامل یک سرویس ویژه 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 دسترسی داشته باشید.
API روش ورودی
کلاسهای مخصوص IME در بستههای android.inputmethodservice
و android.view.inputmethod
یافت میشوند. کلاس KeyEvent
برای مدیریت کاراکترهای صفحه کلید مهم است.
بخش مرکزی یک IME یک جزء سرویس است - کلاسی که InputMethodService
گسترش می دهد. این کلاس علاوه بر پیادهسازی چرخه عمر سرویس عادی، برای ارائه رابط کاربری IME شما، مدیریت ورودی کاربر و تحویل متن به فیلدی که فوکوس دارد، تماسهایی نیز دارد. بهطور پیشفرض، کلاس InputMethodService
بیشتر پیادهسازی را برای مدیریت وضعیت و دید IME و برقراری ارتباط با فیلد ورودی فعلی ارائه میکند.
کلاس های زیر نیز مهم هستند:
-
BaseInputConnection
- کانال ارتباطی را از یک
InputMethod
به برنامهای که ورودی آن را دریافت میکند، تعریف میکند. شما از آن برای خواندن متن در اطراف مکان نما، ارسال متن به جعبه متن و ارسال رویدادهای کلید خام به برنامه استفاده می کنید. برنامه ها باید این کلاس را به جای پیاده سازی رابط پایهInputConnection
گسترش دهند. -
KeyboardView
- یک برنامه افزودنی از
View
که صفحه کلید را رندر می کند و به رویدادهای ورودی کاربر پاسخ می دهد. چیدمان صفحه کلید توسط نمونه ای ازKeyboard
مشخص می شود که می توانید آن را در یک فایل XML تعریف کنید.
UI روش ورودی را طراحی کنید
دو عنصر بصری اصلی برای یک IME وجود دارد: نمای ورودی و نمای کاندیدا . شما فقط باید عناصری را پیاده سازی کنید که با روش ورودی که طراحی می کنید مرتبط هستند.
نمای ورودی
نمای ورودی رابط کاربری است که در آن کاربر متن را به صورت کلیک کلید، دست خط یا اشاره وارد می کند. هنگامی که IME برای اولین بار نمایش داده می شود، سیستم onCreateInputView()
را فراخوانی می کند. در اجرای این روش، طرحی را که می خواهید در پنجره IME نمایش دهید ایجاد کنید و طرح را به سیستم برگردانید. قطعه زیر نمونه ای از پیاده سازی متد onCreateInputView()
نشان می دهد:
کاتلین
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
جاوا
@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()
فرا می خواند. در اجرای این روش، طرحی را برگردانید که پیشنهادات کلمه را نشان می دهد، یا اگر نمی خواهید چیزی نشان داده شود، null را برگردانید. پاسخ تهی رفتار پیشفرض است، بنابراین در صورت عدم ارائه پیشنهاد، نیازی به اجرای آن ندارید.
ملاحظات طراحی رابط کاربری
این بخش برخی از ملاحظات طراحی UI برای IME ها را شرح می دهد.
اندازه های صفحه نمایش متعدد را مدیریت کنید
UI برای IME شما باید بتواند برای اندازه های مختلف صفحه نمایش مقیاس بندی کند و هم جهت افقی و هم عمودی را مدیریت کند. در حالت IME غیر تمام صفحه، فضای کافی برای برنامه برای نمایش فیلد متن و هر زمینه مرتبط با آن بگذارید، به طوری که بیش از نیمی از صفحه توسط IME اشغال نشود. در حالت تمام صفحه IME، این یک مشکل نیست.
انواع مختلف ورودی را مدیریت کنید
فیلدهای متنی Android به شما امکان می دهد نوع ورودی خاصی مانند متن آزاد، اعداد، URL ها، آدرس های ایمیل و رشته های جستجو را تنظیم کنید. هنگامی که یک IME جدید را پیاده سازی می کنید، نوع ورودی هر فیلد را شناسایی کرده و رابط مناسب را برای آن فراهم کنید. با این حال، لازم نیست IME خود را تنظیم کنید تا بررسی کنید آیا کاربر متن معتبری را برای نوع ورودی وارد می کند یا خیر. این مسئولیت بر عهده برنامه ای است که دارای فیلد متنی است.
به عنوان مثال، در اینجا رابطی است که IME لاتین برای ورودی متن پلت فرم اندروید ارائه می کند:

و اینجا رابطی است که IME لاتین برای ورودی عددی پلتفرم اندروید ارائه می کند:

وقتی یک فیلد ورودی فوکوس دریافت میکند و IME شما شروع میشود، سیستم onStartInputView()
را فراخوانی میکند و یک شی EditorInfo
را ارسال میکند که حاوی جزئیات مربوط به نوع ورودی و سایر ویژگیهای فیلد متنی است. در این شی، فیلد inputType
شامل نوع ورودی فیلد متنی است.
فیلد inputType
یک int
است که شامل الگوهای بیت برای تنظیمات مختلف نوع ورودی است. برای آزمایش آن برای نوع ورودی فیلد متن، آن را با ثابت TYPE_MASK_CLASS
ماسک کنید، مانند این:
کاتلین
inputType and InputType.TYPE_MASK_CLASS
جاوا
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
برای وارد کردن رمزهای عبور. روش ورودی، dingbats را به جای متن واقعی نمایش می دهد. -
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!" جایگزین کنید:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
از نوشتن متن قبل از ارتکاب پشتیبانی کنید
اگر IME شما متن را پیشبینی میکند یا برای نوشتن یک علامت یا کلمه به چندین مرحله نیاز دارد، میتوانید پیشرفت را در قسمت متن نشان دهید تا زمانی که کاربر کلمه را متعهد کند و سپس میتوانید ترکیب جزئی را با متن تکمیلشده جایگزین کنید. وقتی متن را به setComposingText()
میفرستید، میتوانید با افزودن یک span به متن، رفتار خاصی را به آن بدهید.
قطعه زیر نحوه نمایش پیشرفت در یک فیلد متنی را نشان می دهد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
رهگیری رویدادهای کلیدی سخت افزاری
اگرچه پنجره روش ورودی فوکوس واضحی ندارد، ابتدا رویدادهای کلیدی سخت افزاری را دریافت می کند و می تواند آنها را مصرف کند یا به برنامه ارسال کند. به عنوان مثال، ممکن است بخواهید از کلیدهای جهت دار برای پیمایش در UI خود برای انتخاب نامزد در طول ترکیب استفاده کنید. همچنین ممکن است بخواهید کلید بازگشت را به دام بیاندازید تا هر گفتگوی منشأ گرفته از پنجره روش ورودی را رد کنید.
برای رهگیری کلیدهای سخت افزاری، onKeyDown()
و onKeyUp()
را لغو کنید.
متد super()
را برای کلیدهایی که نمی خواهید خودتان کنترل کنید، فراخوانی کنید.
یک زیرنوع IME ایجاد کنید
زیرگروهها به IME اجازه میدهند حالتها و زبانهای ورودی متعددی را که توسط یک IME پشتیبانی میشوند، نمایش دهد. یک زیرگروه می تواند نشان دهنده موارد زیر باشد:
- محلی، مانند en_US یا fr_FR
- یک حالت ورودی، مانند صدا، صفحه کلید، یا دست خط
- سایر سبکهای ورودی، فرمها یا ویژگیهای خاص IME، مانند طرحبندی صفحهکلید 10 کلیدی یا QWERTY
حالت می تواند هر متنی باشد، مانند "صفحه کلید" یا "صدا". یک زیرمجموعه همچنین میتواند ترکیبی از این موارد را نشان دهد.
اطلاعات نوع فرعی برای گفتگوی تعویض کننده IME که از نوار اعلان و تنظیمات IME در دسترس است استفاده می شود. این اطلاعات همچنین به چارچوب اجازه میدهد تا زیرنوع خاصی از یک IME را مستقیماً بیاورد. هنگامی که یک IME می سازید، از تسهیلات subtype استفاده کنید، زیرا به کاربر کمک می کند زبان ها و حالت های مختلف IME را شناسایی کرده و بین آنها سوئیچ کند.
با استفاده از عنصر <subtype>
، انواع فرعی را در یکی از فایل های منبع XML روش ورودی تعریف کنید. قطعه کد زیر یک 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>
برای اطمینان از اینکه زیرگروههای شما به درستی در UI برچسبگذاری شدهاند، از «%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
، که توسط تعریف UI روش ورودی برای تنظیم برچسب نوع فرعی استفاده میشود، به صورت زیر تعریف میشود:
<string name="label_subtype_generic">%s</string>
این تنظیم باعث می شود که نام نمایشی نوع فرعی با تنظیمات محلی مطابقت داشته باشد. به عنوان مثال، در هر زبان انگلیسی، نام نمایشی "English (ایالات متحده آمریکا)" است.
زیر انواع IME را از نوار اعلان انتخاب کنید
سیستم اندروید همه زیرشاخههای افشا شده توسط همه IMEها را مدیریت میکند. زیرگروه های IME به عنوان حالت های IME که به آن تعلق دارند در نظر گرفته می شوند. همانطور که در شکل زیر نشان داده شده است، کاربر می تواند از نوار اعلان یا برنامه تنظیمات به منوی زیرگروه های IME موجود پیمایش کند:

زیر انواع IME را از تنظیمات سیستم انتخاب کنید
کاربر همچنین میتواند نحوه استفاده از زیرگروهها را در پانل تنظیمات زبان و ورودی در تنظیمات سیستم کنترل کند:

جابهجایی بین زیرگروههای IME
میتوانید با ارائه یک کلید جابجایی، مانند نماد زبان کرهای روی صفحهکلید، به کاربران اجازه دهید به راحتی بین انواع فرعی IME جابجا شوند. این قابلیت استفاده از صفحه کلید را بهبود می بخشد و برای کاربر راحت است. برای فعال کردن این تغییر، مراحل زیر را انجام دهید:
- در فایل های منبع XML روش ورودی،
supportsSwitchingToNextInputMethod = "true"
را اعلام کنید. اعلان شما باید شبیه قطعه کد زیر باشد:<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">
- متد
shouldOfferSwitchingToNextInputMethod()
فراخوانی کنید. - اگر روش true را برگرداند، یک کلید سوئیچینگ نمایش دهید.
- هنگامی که کاربر روی کلید سوئیچینگ ضربه میزند،
switchToNextInputMethod()
را فراخوانی میکند که false است. مقدار false به سیستم میگوید که همه زیرگروهها را بدون در نظر گرفتن اینکه به کدام IME تعلق دارند، یکسان رفتار کند. تعیین true مستلزم چرخش سیستم در میان انواع فرعی در IME فعلی است.
ملاحظات عمومی IME
در اینجا موارد دیگری وجود دارد که باید هنگام پیاده سازی IME خود در نظر بگیرید:
- راهی برای کاربران فراهم کنید تا گزینهها را مستقیماً از رابط کاربری IME تنظیم کنند.
- راهی را برای کاربران فراهم کنید تا مستقیماً از رابط کاربری روش ورودی به IME دیگری تغییر کنند، زیرا ممکن است چندین IME روی دستگاه نصب شده باشد.
- رابط کاربری IME را به سرعت مطرح کنید. هر منبع بزرگی را از قبل بارگیری یا بارگیری کنید تا کاربران به محض ضربه زدن روی یک فیلد متن، IME را ببینند. منابع و نماهای کش برای فراخوانی های بعدی روش ورودی.
- بلافاصله پس از پنهان شدن پنجره روش ورودی، تخصیص حافظه بزرگ را آزاد کنید تا برنامه ها حافظه کافی برای اجرا داشته باشند. اگر IME برای چند ثانیه مخفی شد، از پیام تاخیری برای انتشار منابع استفاده کنید.
- اطمینان حاصل کنید که کاربران میتوانند تا حد ممکن نویسهها را برای زبان یا محلی مرتبط با IME وارد کنند. کاربران ممکن است از علائم نگارشی در گذرواژهها یا نامهای کاربری استفاده کنند، بنابراین IME شما باید کاراکترهای مختلفی را ارائه کند تا به کاربران اجازه دهد رمز عبور را وارد کرده و به دستگاه دسترسی داشته باشند.
ویرایشگر روش ورودی (IME) یک کنترل کاربر است که به کاربران اجازه می دهد متن را وارد کنند. Android یک چارچوب روش ورودی توسعهیافته ارائه میکند که به برنامهها اجازه میدهد روشهای ورودی جایگزینی مانند صفحهکلید روی صفحه یا ورودی گفتار را در اختیار کاربران قرار دهند. پس از نصب IME ها، کاربر می تواند یکی از تنظیمات سیستم را انتخاب کرده و در کل سیستم استفاده کند. فقط یک IME را می توان در یک زمان فعال کرد.
برای افزودن یک IME به سیستم Android، یک برنامه Android حاوی کلاسی ایجاد کنید که InputMethodService
گسترش دهد. علاوه بر این، شما معمولاً یک فعالیت "تنظیمات" ایجاد می کنید که گزینه ها را به سرویس IME منتقل می کند. همچنین می توانید رابط کاربری تنظیماتی را که به عنوان بخشی از تنظیمات سیستم نمایش داده می شود، تعریف کنید.
این صفحه موضوعات زیر را پوشش می دهد:
- چرخه حیات IME
- اعلان اجزای IME در مانیفست برنامه
- IME API
- طراحی رابط کاربری IME
- ارسال متن از یک IME به یک برنامه
- کار با زیرگروه های IME
- سایر ملاحظات IME
اگر با IME کار نکردهاید، ابتدا مقاله مقدماتی روشهای ورودی روی صفحه را بخوانید.
چرخه حیات IME
نمودار زیر چرخه حیات یک IME را شرح می دهد:

بخشهای زیر نحوه پیادهسازی UI و کد مرتبط با یک IME را که از این چرخه حیات پیروی میکند، توضیح میدهد.
اجزای IME را در مانیفست اعلام کنید
در سیستم اندروید، IME یک برنامه اندرویدی است که شامل یک سرویس ویژه 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 دسترسی داشته باشید.
API روش ورودی
کلاسهای خاص برای IME در بسته های android.inputmethodservice
و android.view.inputmethod
یافت می شود. کلاس KeyEvent
برای دستیابی به کاراکترهای صفحه کلید مهم است.
بخش اصلی یک IME یک مؤلفه خدمات است - کلاس که InputMethodService
را گسترش می دهد. علاوه بر اجرای چرخه خدمات عادی ، این کلاس دارای تماس تلفنی برای ارائه UI IME ، رسیدگی به ورودی کاربر و ارائه متن به فیلد است که تمرکز دارد. به طور پیش فرض ، کلاس InputMethodService
بیشتر اجرای را برای مدیریت دولت و دید IME و برقراری ارتباط با قسمت ورودی فعلی فراهم می کند.
کلاس های زیر نیز مهم هستند:
-
BaseInputConnection
- کانال ارتباطی را از یک
InputMethod
متود به برنامه ای که ورودی خود را دریافت می کند ، تعریف می کند. شما از آن برای خواندن متن در اطراف مکان نما ، متعهد کردن متن به کادر متن استفاده می کنید و رویدادهای کلید خام را به برنامه ارسال می کنید. برنامه ها باید این کلاس را به جای اجرایInputConnection
رابط پایه گسترش دهند. -
KeyboardView
-
View
گسترده ای که صفحه کلید را ارائه می دهد و به رویدادهای ورودی کاربر پاسخ می دهد. طرح صفحه کلید توسط نمونه ای ازKeyboard
مشخص شده است که می توانید در یک فایل XML تعریف کنید.
روش ورودی UI را طراحی کنید
دو عنصر بصری اصلی برای IME وجود دارد: نمای ورودی و مشاهده نامزدها . شما فقط باید عناصر مرتبط با روش ورودی را که طراحی می کنید را پیاده سازی کنید.
نمای ورودی
نمای ورودی UI است که در آن کاربر متن را به صورت کلیدها ، دست نوشته ها یا حرکات وارد می کند. هنگامی که IME برای اولین بار نمایش داده می شود ، سیستم با پاسخ به تماس onCreateInputView()
تماس می گیرد. در اجرای این روش ، طرح بندی را که می خواهید در پنجره IME نمایش دهید ایجاد کنید و طرح را به سیستم برگردانید. قطعه زیر نمونه ای از اجرای روش onCreateInputView()
را نشان می دهد:
کاتلین
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
جاوا
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); return inputView; }
در این مثال ، MyKeyboardView
نمونه ای از اجرای سفارشی از KeyboardView
است که یک Keyboard
ارائه می دهد.
مشاهده نامزدها
نمای نامزدها UI است که IME اصلاحات یا پیشنهادات بالقوه کلمه را برای انتخاب کاربر نشان می دهد. در چرخه عمر IME ، سیستم در صورت آماده شدن برای نمایش نمای نامزدها ، onCreateCandidatesView()
تماس می گیرد. در اجرای این روش ، یک طرح را برگردانید که پیشنهادات کلمه را نشان می دهد ، یا اگر نمی خواهید چیزی نشان دهید ، تهی را برگردانید. پاسخ تهی رفتار پیش فرض است ، بنابراین اگر پیشنهادی ارائه ندهید ، لازم نیست این کار را اجرا کنید.
ملاحظات طراحی UI
در این بخش برخی از ملاحظات طراحی UI برای IMES شرح داده شده است.
اندازه چندین صفحه را کنترل کنید
UI برای IME شما باید بتواند در اندازه های مختلف صفحه نمایش مقیاس کند و هر دو جهت گیری چشم انداز و پرتره را اداره کند. در حالت IME غیر صفحه نمایش ، فضای کافی را برای برنامه برای نشان دادن قسمت متن و هر زمینه مرتبط با آن باقی بگذارید ، به طوری که بیش از نیمی از صفحه نمایش توسط IME اشغال نشده است. در حالت IME تمام صفحه ، این مسئله نیست.
انواع ورودی های مختلف را کنترل کنید
فیلدهای متن Android به شما امکان می دهد یک نوع ورودی خاص مانند متن آزاد ، شماره ها ، URL ها ، آدرس های ایمیل و رشته های جستجو را تنظیم کنید. هنگامی که یک IME جدید را پیاده سازی می کنید ، نوع ورودی هر قسمت را تشخیص داده و رابط مناسب را برای آن فراهم کنید. با این حال ، لازم نیست IME خود را تنظیم کنید تا بررسی کنید که آیا کاربر برای نوع ورودی وارد متن معتبر می شود یا خیر. این مسئولیت برنامه کاربردی است که صاحب قسمت متن است.
به عنوان مثال ، رابط کاربری که IME لاتین برای ورودی متن Android Platform ارائه می دهد:

و در اینجا رابط کاربری که IME لاتین برای ورودی عددی سیستم عامل Android ارائه می دهد:

هنگامی که یک قسمت ورودی تمرکز را دریافت می کند و IME شما شروع می شود ، سیستم با استفاده onStartInputView()
تماس می گیرد ، و در یک شی EditorInfo
که حاوی جزئیات مربوط به نوع ورودی و سایر ویژگی های قسمت متن است ، عبور می کند. در این شی ، قسمت inputType
شامل نوع ورودی فیلد متن است.
قسمت inputType
یک int
است که شامل الگوهای بیت برای تنظیمات مختلف نوع ورودی است. برای آزمایش آن برای نوع ورودی قسمت متن ، آن را با نوع ثابت TYPE_MASK_CLASS
ماسک کنید ، مانند این:
کاتلین
inputType and InputType.TYPE_MASK_CLASS
جاوا
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
برای وارد کردن رمزهای عبور. روش ورودی به جای متن واقعی ، Dingbats را نشان می دهد. -
TYPE_TEXT_VARIATION_URI
- یک نوع از
TYPE_CLASS_TEXT
برای وارد کردن URL های وب و سایر شناسه های یکنواخت منابع (URIS). -
TYPE_TEXT_FLAG_AUTO_COMPLETE
- یک نوع از
TYPE_CLASS_TEXT
برای وارد کردن متن که برنامه کاربردی از یک فرهنگ لغت ، جستجو یا سایر امکانات است.
ماسک inputType
با ثابت مناسب هنگام تست این انواع. ثابت های ماسک موجود در مستندات مرجع برای InputType
ذکر شده است.
ارسال متن به برنامه
به عنوان کاربر متن را با IME خود وارد می کند ، می توانید با ارسال رویدادهای کلیدی فردی یا با ویرایش متن اطراف مکان نما در قسمت متن برنامه ، متن را به برنامه ارسال کنید. در هر صورت ، برای ارائه متن از نمونه ای از InputConnection
استفاده کنید. برای به دست آوردن این مثال ، با InputMethodService.getCurrentInputConnection()
.
متن را در اطراف مکان نما ویرایش کنید
هنگامی که ویرایش متن موجود را انجام می دهید ، برخی از روشهای مفید در BaseInputConnection
موارد زیر است:
-
getTextBeforeCursor()
- قبل از موقعیت مکان نما فعلی ، یک
CharSequence
حاوی تعداد شخصیت های درخواستی را برمی گرداند. -
getTextAfterCursor()
- پس از موقعیت مکان نما فعلی ، یک
CharSequence
حاوی تعداد شخصیت های درخواست شده را برمی گرداند. -
deleteSurroundingText()
- تعداد مشخص شده کاراکترها را قبل و زیر موقعیت مکان نما فعلی حذف می کند.
-
commitText()
- متعهد به قسمت متن
CharSequence
و موقعیت مکان نما جدید را تعیین می کند.
به عنوان مثال ، قطعه زیر نشان می دهد که چگونه می توان چهار کاراکتر را در سمت چپ مکان نما با متن "سلام!" جایگزین کرد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
قبل از تعهد از متن آهنگسازی پشتیبانی کنید
اگر IME شما متن را پیش بینی می کند یا برای تهیه یک گلیف یا کلمه به چندین مرحله نیاز دارد ، می توانید پیشرفت را در قسمت متن نشان دهید تا کاربر کلمه را مرتکب شود ، و سپس می توانید ترکیب جزئی را با متن تکمیل شده جایگزین کنید. هنگام عبور از آن به setComposingText()
می توانید با اضافه کردن یک دهانه به آن ، به متن درمانی ویژه دهید.
قطعه زیر نحوه نشان دادن پیشرفت در یک قسمت متن را نشان می دهد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
وقایع کلیدی سخت افزار را رهگیری کنید
حتی اگر پنجره روش ورودی تمرکز صریح نداشته باشد ، ابتدا رویدادهای کلیدی سخت افزار را دریافت می کند و می تواند آنها را مصرف کند یا آنها را به سمت برنامه سوق دهد. به عنوان مثال ، شما ممکن است بخواهید کلیدهای جهت دار را برای حرکت در UI خود برای انتخاب نامزد در طول ترکیب مصرف کنید. همچنین ممکن است بخواهید کلید پشتی را به دام بیندازید تا هرگونه گفتگوی منشأ از پنجره روش ورودی را رد کنید.
برای رهگیری کلیدهای سخت افزاری ، onKeyDown()
و onKeyUp()
را نادیده بگیرید.
برای کلیدهایی که نمی خواهید خود را اداره کنید ، با روش super()
تماس بگیرید.
یک زیرگروه IME ایجاد کنید
زیرگروه ها به IME اجازه می دهند چندین حالت ورودی و زبانهای پشتیبانی شده توسط IME را در معرض دید قرار دهند. یک زیرگروه می تواند موارد زیر را نشان دهد:
- محلی ، مانند en_us یا fr_fr
- یک حالت ورودی ، مانند صدا ، صفحه کلید یا دست نویس
- سایر سبک ها ، فرم ها یا خواص خاص برای IME ، مانند طرح های صفحه کلید 10 کلید یا QWERTY
حالت می تواند هر متنی مانند "صفحه کلید" یا "صدا" باشد. یک زیرگروه همچنین می تواند ترکیبی از این موارد را در معرض نمایش بگذارد.
اطلاعات زیرگروه برای یک گفتگوی سوئیچر IME که از نوار اعلان و برای تنظیمات IME در دسترس است استفاده می شود. این اطلاعات همچنین به این چارچوب اجازه می دهد تا زیرنویس خاصی از 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>
برای اطمینان از اینکه زیرگروه های شما به درستی در UI برچسب گذاری شده است ، از `٪ s 'برای تهیه یک برچسب زیرگروه استفاده کنید که همان برچسب محلی زیرگروه باشد. این در دو قطعه کد بعدی نشان داده شده است. اولین قطعه بخشی از پرونده XML روش ورودی را نشان می دهد:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
قطعه بعدی بخشی از پرونده IME است strings.xml
است. منبع رشته label_subtype_generic
، که توسط تعریف روش ورودی UI برای تنظیم برچسب زیرگروه استفاده می شود ، به شرح زیر تعریف می شود:
<string name="label_subtype_generic">%s</string>
این تنظیم باعث می شود نام نمایشگرهای زیرگروه با تنظیمات محلی مطابقت داشته باشد. به عنوان مثال ، در هر محلی انگلیسی ، نام نمایش "انگلیسی (ایالات متحده)" است.
زیرگروه های IME را از نوار اعلان انتخاب کنید
سیستم Android تمام زیرگروه های در معرض همه IME ها را مدیریت می کند. زیرگروه های IME به عنوان شیوه های IME که متعلق به آنها است ، رفتار می شوند. کاربر می تواند از نوار اعلان یا برنامه تنظیمات به منوی زیرگروه های IME موجود حرکت کند ، همانطور که در شکل زیر نشان داده شده است:

زیر مجموعه های IME را از تنظیمات سیستم انتخاب کنید
کاربر همچنین می تواند نحوه استفاده از زیرگروه ها در پانل تنظیمات زبان و ورودی را در تنظیمات سیستم کنترل کند:

بین زیرگروه های IME تغییر دهید
می توانید با تهیه یک کلید سوئیچینگ مانند نماد زبان Globe به شکل روی صفحه کلید ، به راحتی کاربران را به راحتی در میان زیرگروه های IME جابجا کنید. این قابلیت استفاده صفحه کلید را بهبود می بخشد و برای کاربر مناسب است. برای فعال کردن این تعویض ، مراحل زیر را انجام دهید:
- DELLARE
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">
- با روش
shouldOfferSwitchingToNextInputMethod()
تماس بگیرید. - اگر این روش صحیح است ، یک کلید سوئیچینگ را نمایش دهید.
- هنگامی که کاربر کلید سوئیچینگ را لمس می کند ، با
switchToNextInputMethod()
تماس بگیرید ، با عبور کاذب. یک مقدار کاذب به سیستم می گوید بدون توجه به آنچه در آن تعلق دارد ، با همه زیرگروه ها به طور یکسان رفتار کند. مشخص کردن TRUE به سیستم نیاز دارد تا از طریق زیرگروه ها در IME فعلی چرخه کند.
ملاحظات عمومی IME
در اینجا موارد دیگری وجود دارد که باید هنگام اجرای IME خود در نظر بگیرید:
- راهی را برای کاربران فراهم کنید تا گزینه های مستقیم از UI IME را تنظیم کنند.
- راهی را برای کاربران فراهم کنید تا مستقیماً از روش ورودی UI به IME متفاوت تغییر دهند ، زیرا ممکن است چندین IME روی دستگاه نصب شود.
- UI IME را به سرعت مطرح کنید. از قبل بارگذاری یا بارگیری هرگونه منابع بزرگ را از قبل بارگیری کنید تا کاربران به محض ضربه زدن به قسمت متن ، IME را ببینند. منابع و دیدگاههای حافظه نهان برای دعوت های بعدی از روش ورودی.
- تخصیص حافظه بزرگ را بلافاصله پس از پنهان شدن پنجره روش ورودی آزاد کنید ، به طوری که برنامه ها حافظه کافی برای اجرای آن دارند. در صورت پنهان کردن IME برای چند ثانیه از یک پیام تأخیر برای انتشار منابع استفاده کنید.
- اطمینان حاصل کنید که کاربران می توانند تا حد ممکن کاراکترها را برای زبان یا محلی مرتبط با IME وارد کنند. کاربران ممکن است از نگارشی در رمزهای عبور یا نام کاربری استفاده کنند ، بنابراین IME شما باید شخصیت های مختلفی را ارائه دهد تا کاربران بتوانند رمز عبور را وارد کرده و به دستگاه دسترسی پیدا کنند.
ویرایشگر روش ورودی (IME) یک کنترل کاربر است که به کاربران اجازه می دهد متن را وارد کنند. Android یک چارچوب متداول ورودی گسترده را فراهم می کند که به برنامه ها اجازه می دهد روش های ورودی جایگزین مانند صفحه کلید روی صفحه یا ورودی گفتار را به کاربران ارائه دهد. پس از نصب IMES ، کاربر می تواند یکی را از تنظیمات سیستم انتخاب کرده و از آن در کل سیستم استفاده کند. فقط یک IME می تواند در یک زمان فعال شود.
برای افزودن IME به سیستم Android ، یک برنامه Android حاوی کلاس ایجاد کنید که InputMethodService
گسترش دهد. علاوه بر این ، شما معمولاً یک فعالیت "تنظیمات" ایجاد می کنید که گزینه ها را به سرویس IME منتقل می کند. همچنین می توانید UI تنظیماتی را که به عنوان بخشی از تنظیمات سیستم نمایش داده می شود ، تعریف کنید.
این صفحه موضوعات زیر را در بر می گیرد:
- چرخه عمر IME
- اعلام مؤلفه های IME در آشکار برنامه
- IME API
- طراحی یک UI IME
- ارسال متن از IME به یک برنامه
- کار با زیرگروه های IME
- سایر ملاحظات IME
اگر با IME کار نکرده اید ، ابتدا مقاله مقدماتی را روی صفحه نمایش بخوانید.
چرخه عمر IME
نمودار زیر چرخه عمر یک IME را توصیف می کند:

در بخش های زیر نحوه اجرای UI و کد مرتبط با IME که از این چرخه عمر پیروی می کند ، توضیح می دهد.
اجزای IME را در مانیفست اعلام کنید
در سیستم اندرویدی ، IME یک برنامه اندرویدی است که حاوی یک سرویس ویژه IME است. پرونده مانیفست برنامه باید سرویس را اعلام کند ، مجوزهای لازم را درخواست کند ، یک فیلتر هدف را ارائه دهد که مطابق با action.view.InputMethod
باشد. 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>
همچنین می توانید به طور مستقیم از UI آن به تنظیمات IME دسترسی پیدا کنید.
روش ورودی API
کلاسهای خاص برای IME در بسته های android.inputmethodservice
و android.view.inputmethod
یافت می شود. کلاس KeyEvent
برای دستیابی به کاراکترهای صفحه کلید مهم است.
بخش اصلی یک IME یک مؤلفه خدمات است - کلاس که InputMethodService
را گسترش می دهد. علاوه بر اجرای چرخه خدمات عادی ، این کلاس دارای تماس تلفنی برای ارائه UI IME ، رسیدگی به ورودی کاربر و ارائه متن به فیلد است که تمرکز دارد. به طور پیش فرض ، کلاس InputMethodService
بیشتر اجرای را برای مدیریت دولت و دید IME و برقراری ارتباط با قسمت ورودی فعلی فراهم می کند.
کلاس های زیر نیز مهم هستند:
-
BaseInputConnection
- کانال ارتباطی را از یک
InputMethod
متود به برنامه ای که ورودی خود را دریافت می کند ، تعریف می کند. شما از آن برای خواندن متن در اطراف مکان نما ، متعهد کردن متن به کادر متن استفاده می کنید و رویدادهای کلید خام را به برنامه ارسال می کنید. برنامه ها باید این کلاس را به جای اجرایInputConnection
رابط پایه گسترش دهند. -
KeyboardView
-
View
گسترده ای که صفحه کلید را ارائه می دهد و به رویدادهای ورودی کاربر پاسخ می دهد. طرح صفحه کلید توسط نمونه ای ازKeyboard
مشخص شده است که می توانید در یک فایل XML تعریف کنید.
روش ورودی UI را طراحی کنید
دو عنصر بصری اصلی برای IME وجود دارد: نمای ورودی و مشاهده نامزدها . شما فقط باید عناصر مرتبط با روش ورودی را که طراحی می کنید را پیاده سازی کنید.
نمای ورودی
نمای ورودی UI است که در آن کاربر متن را به صورت کلیدها ، دست نوشته ها یا حرکات وارد می کند. هنگامی که IME برای اولین بار نمایش داده می شود ، سیستم با پاسخ به تماس onCreateInputView()
تماس می گیرد. در اجرای این روش ، طرح بندی را که می خواهید در پنجره IME نمایش دهید ایجاد کنید و طرح را به سیستم برگردانید. قطعه زیر نمونه ای از اجرای روش onCreateInputView()
را نشان می دهد:
کاتلین
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
جاوا
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); return inputView; }
در این مثال ، MyKeyboardView
نمونه ای از اجرای سفارشی از KeyboardView
است که یک Keyboard
ارائه می دهد.
مشاهده نامزدها
نمای نامزدها UI است که IME اصلاحات یا پیشنهادات بالقوه کلمه را برای انتخاب کاربر نشان می دهد. در چرخه عمر IME ، سیستم در صورت آماده شدن برای نمایش نمای نامزدها ، onCreateCandidatesView()
تماس می گیرد. در اجرای این روش ، یک طرح را برگردانید که پیشنهادات کلمه را نشان می دهد ، یا اگر نمی خواهید چیزی نشان دهید ، تهی را برگردانید. پاسخ تهی رفتار پیش فرض است ، بنابراین اگر پیشنهادی ارائه ندهید ، لازم نیست این کار را اجرا کنید.
ملاحظات طراحی UI
در این بخش برخی از ملاحظات طراحی UI برای IMES شرح داده شده است.
اندازه چندین صفحه را کنترل کنید
UI برای IME شما باید بتواند در اندازه های مختلف صفحه نمایش مقیاس کند و هر دو جهت گیری چشم انداز و پرتره را اداره کند. در حالت IME غیر صفحه نمایش ، فضای کافی را برای برنامه برای نشان دادن قسمت متن و هر زمینه مرتبط با آن باقی بگذارید ، به طوری که بیش از نیمی از صفحه نمایش توسط IME اشغال نشده است. در حالت IME تمام صفحه ، این مسئله نیست.
انواع ورودی های مختلف را کنترل کنید
فیلدهای متن Android به شما امکان می دهد یک نوع ورودی خاص مانند متن آزاد ، شماره ها ، URL ها ، آدرس های ایمیل و رشته های جستجو را تنظیم کنید. هنگامی که یک IME جدید را پیاده سازی می کنید ، نوع ورودی هر قسمت را تشخیص داده و رابط مناسب را برای آن فراهم کنید. با این حال ، لازم نیست IME خود را تنظیم کنید تا بررسی کنید که آیا کاربر برای نوع ورودی وارد متن معتبر می شود یا خیر. این مسئولیت برنامه کاربردی است که صاحب قسمت متن است.
به عنوان مثال ، رابط کاربری که IME لاتین برای ورودی متن Android Platform ارائه می دهد:

و در اینجا رابط کاربری که IME لاتین برای ورودی عددی سیستم عامل Android ارائه می دهد:

هنگامی که یک قسمت ورودی تمرکز را دریافت می کند و IME شما شروع می شود ، سیستم با استفاده onStartInputView()
تماس می گیرد ، و در یک شی EditorInfo
که حاوی جزئیات مربوط به نوع ورودی و سایر ویژگی های قسمت متن است ، عبور می کند. در این شی ، قسمت inputType
شامل نوع ورودی فیلد متن است.
قسمت inputType
یک int
است که شامل الگوهای بیت برای تنظیمات مختلف نوع ورودی است. برای آزمایش آن برای نوع ورودی قسمت متن ، آن را با نوع ثابت TYPE_MASK_CLASS
ماسک کنید ، مانند این:
کاتلین
inputType and InputType.TYPE_MASK_CLASS
جاوا
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
برای وارد کردن رمزهای عبور. روش ورودی به جای متن واقعی ، Dingbats را نشان می دهد. -
TYPE_TEXT_VARIATION_URI
- یک نوع از
TYPE_CLASS_TEXT
برای وارد کردن URL های وب و سایر شناسه های یکنواخت منابع (URIS). -
TYPE_TEXT_FLAG_AUTO_COMPLETE
- یک نوع از
TYPE_CLASS_TEXT
برای وارد کردن متن که برنامه کاربردی از یک فرهنگ لغت ، جستجو یا سایر امکانات است.
ماسک inputType
با ثابت مناسب هنگام تست این انواع. ثابت های ماسک موجود در مستندات مرجع برای InputType
ذکر شده است.
ارسال متن به برنامه
به عنوان کاربر متن را با IME خود وارد می کند ، می توانید با ارسال رویدادهای کلیدی فردی یا با ویرایش متن اطراف مکان نما در قسمت متن برنامه ، متن را به برنامه ارسال کنید. در هر صورت ، برای ارائه متن از نمونه ای از InputConnection
استفاده کنید. برای به دست آوردن این مثال ، با InputMethodService.getCurrentInputConnection()
.
متن را در اطراف مکان نما ویرایش کنید
هنگامی که ویرایش متن موجود را انجام می دهید ، برخی از روشهای مفید در BaseInputConnection
موارد زیر است:
-
getTextBeforeCursor()
- قبل از موقعیت مکان نما فعلی ، یک
CharSequence
حاوی تعداد شخصیت های درخواستی را برمی گرداند. -
getTextAfterCursor()
- پس از موقعیت مکان نما فعلی ، یک
CharSequence
حاوی تعداد شخصیت های درخواست شده را برمی گرداند. -
deleteSurroundingText()
- تعداد مشخص شده کاراکترها را قبل و زیر موقعیت مکان نما فعلی حذف می کند.
-
commitText()
- متعهد به قسمت متن
CharSequence
و موقعیت مکان نما جدید را تعیین می کند.
به عنوان مثال ، قطعه زیر نشان می دهد که چگونه می توان چهار کاراکتر را در سمت چپ مکان نما با متن "سلام!" جایگزین کرد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
قبل از تعهد از متن آهنگسازی پشتیبانی کنید
اگر IME شما متن را پیش بینی می کند یا برای تهیه یک گلیف یا کلمه به چندین مرحله نیاز دارد ، می توانید پیشرفت را در قسمت متن نشان دهید تا کاربر کلمه را مرتکب شود ، و سپس می توانید ترکیب جزئی را با متن تکمیل شده جایگزین کنید. هنگام عبور از آن به setComposingText()
می توانید با اضافه کردن یک دهانه به آن ، به متن درمانی ویژه دهید.
قطعه زیر نحوه نشان دادن پیشرفت در یک قسمت متن را نشان می دهد:
کاتلین
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
جاوا
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
وقایع کلیدی سخت افزار را رهگیری کنید
حتی اگر پنجره روش ورودی تمرکز صریح نداشته باشد ، ابتدا رویدادهای کلیدی سخت افزار را دریافت می کند و می تواند آنها را مصرف کند یا آنها را به سمت برنامه سوق دهد. به عنوان مثال ، شما ممکن است بخواهید کلیدهای جهت دار را برای حرکت در UI خود برای انتخاب نامزد در طول ترکیب مصرف کنید. همچنین ممکن است بخواهید کلید پشتی را به دام بیندازید تا هرگونه گفتگوی منشأ از پنجره روش ورودی را رد کنید.
برای رهگیری کلیدهای سخت افزاری ، onKeyDown()
و onKeyUp()
را نادیده بگیرید.
برای کلیدهایی که نمی خواهید خود را اداره کنید ، با روش super()
تماس بگیرید.
یک زیرگروه IME ایجاد کنید
زیرگروه ها به IME اجازه می دهند چندین حالت ورودی و زبانهای پشتیبانی شده توسط IME را در معرض دید قرار دهند. یک زیرگروه می تواند موارد زیر را نشان دهد:
- محلی ، مانند en_us یا fr_fr
- یک حالت ورودی ، مانند صدا ، صفحه کلید یا دست نویس
- سایر سبک ها ، فرم ها یا خواص خاص برای IME ، مانند طرح های صفحه کلید 10 کلید یا QWERTY
حالت می تواند هر متنی مانند "صفحه کلید" یا "صدا" باشد. یک زیرگروه همچنین می تواند ترکیبی از این موارد را در معرض نمایش بگذارد.
اطلاعات زیرگروه برای یک گفتگوی سوئیچر IME که از نوار اعلان و برای تنظیمات IME در دسترس است استفاده می شود. این اطلاعات همچنین به این چارچوب اجازه می دهد تا زیرنویس خاصی از 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>
برای اطمینان از اینکه زیرگروه های شما به درستی در UI برچسب گذاری شده است ، از `٪ s 'برای تهیه یک برچسب زیرگروه استفاده کنید که همان برچسب محلی زیرگروه باشد. این در دو قطعه کد بعدی نشان داده شده است. اولین قطعه بخشی از پرونده XML روش ورودی را نشان می دهد:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
قطعه بعدی بخشی از پرونده IME است strings.xml
است. منبع رشته label_subtype_generic
، که توسط تعریف روش ورودی UI برای تنظیم برچسب زیرگروه استفاده می شود ، به شرح زیر تعریف می شود:
<string name="label_subtype_generic">%s</string>
این تنظیم باعث می شود نام نمایشگرهای زیرگروه با تنظیمات محلی مطابقت داشته باشد. به عنوان مثال ، در هر محلی انگلیسی ، نام نمایش "انگلیسی (ایالات متحده)" است.
زیرگروه های IME را از نوار اعلان انتخاب کنید
سیستم Android تمام زیرگروه های در معرض همه IME ها را مدیریت می کند. زیرگروه های IME به عنوان شیوه های IME که متعلق به آنها است ، رفتار می شوند. کاربر می تواند از نوار اعلان یا برنامه تنظیمات به منوی زیرگروه های IME موجود حرکت کند ، همانطور که در شکل زیر نشان داده شده است:

زیر مجموعه های IME را از تنظیمات سیستم انتخاب کنید
کاربر همچنین می تواند نحوه استفاده از زیرگروه ها در پانل تنظیمات زبان و ورودی را در تنظیمات سیستم کنترل کند:

بین زیرگروه های IME تغییر دهید
می توانید با تهیه یک کلید سوئیچینگ مانند نماد زبان Globe به شکل روی صفحه کلید ، به راحتی کاربران را به راحتی در میان زیرگروه های IME جابجا کنید. این قابلیت استفاده صفحه کلید را بهبود می بخشد و برای کاربر مناسب است. برای فعال کردن این تعویض ، مراحل زیر را انجام دهید:
- DELLARE
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">
- با روش
shouldOfferSwitchingToNextInputMethod()
تماس بگیرید. - اگر این روش صحیح است ، یک کلید سوئیچینگ را نمایش دهید.
- هنگامی که کاربر کلید سوئیچینگ را لمس می کند ، با
switchToNextInputMethod()
تماس بگیرید ، با عبور کاذب. یک مقدار کاذب به سیستم می گوید بدون توجه به آنچه در آن تعلق دارد ، با همه زیرگروه ها به طور یکسان رفتار کند. مشخص کردن TRUE به سیستم نیاز دارد تا از طریق زیرگروه ها در IME فعلی چرخه کند.
ملاحظات عمومی IME
در اینجا موارد دیگری وجود دارد که باید هنگام اجرای IME خود در نظر بگیرید:
- راهی را برای کاربران فراهم کنید تا گزینه های مستقیم از UI IME را تنظیم کنند.
- راهی را برای کاربران فراهم کنید تا مستقیماً از روش ورودی UI به IME متفاوت تغییر دهند ، زیرا ممکن است چندین IME روی دستگاه نصب شود.
- UI IME را به سرعت مطرح کنید. از قبل بارگذاری یا بارگیری هرگونه منابع بزرگ را از قبل بارگیری کنید تا کاربران به محض ضربه زدن به قسمت متن ، IME را ببینند. منابع و دیدگاههای حافظه نهان برای دعوت های بعدی از روش ورودی.
- تخصیص حافظه بزرگ را بلافاصله پس از پنهان شدن پنجره روش ورودی آزاد کنید ، به طوری که برنامه ها حافظه کافی برای اجرای آن دارند. در صورت پنهان کردن IME برای چند ثانیه از یک پیام تأخیر برای انتشار منابع استفاده کنید.
- اطمینان حاصل کنید که کاربران می توانند تا حد ممکن کاراکترها را برای زبان یا محلی مرتبط با IME وارد کنند. کاربران ممکن است از نگارشی در رمزهای عبور یا نام کاربری استفاده کنند ، بنابراین IME شما باید شخصیت های مختلفی را ارائه دهد تا کاربران بتوانند رمز عبور را وارد کرده و به دستگاه دسترسی پیدا کنند.