ইনপুট মেথড এডিটর (IME) হলো একটি ইউজার কন্ট্রোল যা ব্যবহারকারীদের টেক্সট প্রবেশ করাতে দেয়। অ্যান্ড্রয়েড একটি এক্সটেনসিবল ইনপুট-মেথড ফ্রেমওয়ার্ক প্রদান করে, যা অ্যাপ্লিকেশনগুলোকে ব্যবহারকারীদের জন্য বিকল্প ইনপুট পদ্ধতি, যেমন অন-স্ক্রিন কীবোর্ড বা স্পিচ ইনপুট, সরবরাহ করতে দেয়। IME-গুলো ইনস্টল করার পর, ব্যবহারকারী সিস্টেম সেটিংস থেকে একটি বেছে নিতে পারেন এবং পুরো সিস্টেমে সেটি ব্যবহার করতে পারেন। একবারে শুধুমাত্র একটি IME সক্রিয় করা যায়।
অ্যান্ড্রয়েড সিস্টেমে একটি IME যোগ করতে, এমন একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করুন যাতে InputMethodService এক্সটেন্ড করা একটি ক্লাস থাকে। এছাড়াও, সাধারণত একটি "সেটিংস" অ্যাক্টিভিটি তৈরি করতে হয় যা IME সার্ভিসে অপশনগুলো পাঠায়। আপনি একটি সেটিংস UI-ও সংজ্ঞায়িত করতে পারেন যা সিস্টেম সেটিংসের অংশ হিসেবে প্রদর্শিত হয়।
এই পৃষ্ঠায় নিম্নলিখিত বিষয়গুলো আলোচনা করা হয়েছে:
- আইএমই জীবনচক্র
- অ্যাপ্লিকেশন ম্যানিফেস্টে IME উপাদান ঘোষণা করা
- আইএমই এপিআই
- একটি IME UI ডিজাইন করা
- একটি IME থেকে একটি অ্যাপ্লিকেশনে টেক্সট পাঠানো
- আইএমই সাবটাইপ নিয়ে কাজ করা
- অন্যান্য আইএমই বিবেচ্য বিষয়
আপনি যদি আগে IME নিয়ে কাজ না করে থাকেন, তাহলে প্রথমে ‘অন-স্ক্রিন ইনপুট মেথডস’ শীর্ষক পরিচিতিমূলক প্রবন্ধটি পড়ুন।
আইএমই জীবনচক্র
নিম্নোক্ত চিত্রটি একটি IME-এর জীবনচক্র বর্ণনা করে:

নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে কীভাবে এই জীবনচক্র অনুসরণকারী একটি IME-এর সাথে সম্পর্কিত UI এবং কোড বাস্তবায়ন করতে হয়।
ম্যানিফেস্টে IME উপাদানগুলি ঘোষণা করুন
অ্যান্ড্রয়েড সিস্টেমে, একটি IME হলো এমন একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন যাতে একটি বিশেষ IME সার্ভিস থাকে। অ্যাপ্লিকেশনটির ম্যানিফেস্ট ফাইলে অবশ্যই সার্ভিসটি ডিক্লেয়ার করতে হবে, প্রয়োজনীয় পারমিশনের জন্য অনুরোধ করতে হবে, action.view.InputMethod অ্যাকশনের সাথে মেলে এমন একটি ইন্টেন্ট ফিল্টার প্রদান করতে হবে এবং IME-এর বৈশিষ্ট্য নির্ধারণকারী মেটাডেটা সরবরাহ করতে হবে। এছাড়াও, ব্যবহারকারীকে IME-এর আচরণ পরিবর্তন করার সুযোগ দিতে একটি সেটিংস ইন্টারফেস প্রদানের জন্য, একটি "settings" অ্যাক্টিভিটি সংজ্ঞায়িত করা যেতে পারে, যা সিস্টেম সেটিংস থেকে চালু করা যায়।
নিম্নলিখিত কোড স্নিপেটটি একটি IME সার্ভিস ঘোষণা করে। এটি সার্ভিসটিকে সিস্টেমের সাথে IME সংযোগ করার অনুমতি দেওয়ার জন্য BIND_INPUT_METHOD পারমিশনের জন্য অনুরোধ করে, 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-এর UI থেকেও এর সেটিংসে অ্যাক্সেস দিতে পারেন।
ইনপুট পদ্ধতি এপিআই
IME-এর জন্য নির্দিষ্ট ক্লাসগুলো android.inputmethodservice এবং android.view.inputmethod প্যাকেজগুলোতে পাওয়া যায়। কীবোর্ডের অক্ষরগুলো পরিচালনা করার জন্য KeyEvent ক্লাসটি গুরুত্বপূর্ণ।
একটি IME-এর কেন্দ্রীয় অংশ হলো একটি সার্ভিস কম্পোনেন্ট—এমন একটি ক্লাস যা InputMethodService এক্সটেন্ড করে। সাধারণ সার্ভিস লাইফসাইকেল বাস্তবায়নের পাশাপাশি, এই ক্লাসে আপনার IME-এর UI প্রদান, ব্যবহারকারীর ইনপুট গ্রহণ এবং ফোকাস থাকা ফিল্ডে টেক্সট পৌঁছে দেওয়ার জন্য কলব্যাক থাকে। ডিফল্টরূপে, 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() কল করে। এই মেথডটির আপনার ইমপ্লিমেন্টেশনে, এমন একটি লেআউট রিটার্ন করুন যা শব্দের পরামর্শ দেখায়, অথবা যদি আপনি কিছুই দেখাতে না চান তবে null রিটার্ন করুন। null রেসপন্স হলো ডিফল্ট আচরণ, তাই আপনি যদি কোনো পরামর্শ না দেন তবে এটি ইমপ্লিমেন্ট করার প্রয়োজন নেই।
UI ডিজাইন বিবেচ্য বিষয়
এই অংশে আইএমই-এর জন্য কিছু ইউআই ডিজাইন বিবেচ্য বিষয় বর্ণনা করা হয়েছে।
একাধিক স্ক্রিন সাইজ পরিচালনা করুন
আপনার IME-এর UI-কে অবশ্যই বিভিন্ন স্ক্রিন সাইজের জন্য স্কেল করতে সক্ষম হতে হবে এবং ল্যান্ডস্কেপ ও পোর্ট্রেট উভয় ওরিয়েন্টেশনই সামলাতে পারতে হবে। নন-ফুলস্ক্রিন 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 - সংখ্যা প্রবেশ করানোর জন্য একটি টেক্সট ফিল্ড। চিত্র ৩-এ যেমন দেখানো হয়েছে, ল্যাটিন আইএমই এই ধরনের ফিল্ডের জন্য একটি নাম্বার প্যাড প্রদর্শন করে।
-
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এর একটি রূপভেদ। -
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() ফাংশনে টেক্সটটি পাঠানোর সময় এর সাথে একটি স্প্যান যোগ করে আপনি এটিকে বিশেষ রূপ দিতে পারেন।
নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে একটি টেক্সট ফিল্ডে অগ্রগতি প্রদর্শন করতে হয়:
কোটলিন
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 সাবটাইপ তৈরি করুন
সাবটাইপগুলো আইএমই-কে একাধিক ইনপুট মোড এবং ভাষা প্রকাশ করার সুযোগ দেয় যা একটি আইএমই সমর্থন করে। একটি সাবটাইপ নিম্নলিখিত বিষয়গুলো উপস্থাপন করতে পারে:
- একটি লোকেল, যেমন en_US বা fr_FR
- একটি ইনপুট মোড, যেমন ভয়েস, কীবোর্ড বা হস্তাক্ষর।
- আইএমই-এর নিজস্ব অন্যান্য ইনপুট স্টাইল, ফর্ম বা প্রোপার্টি, যেমন ১০-কী বা কোয়ার্টি (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>এই সেটিংটি সাবটাইপের প্রদর্শিত নামকে লোকেল সেটিংয়ের সাথে মিলিয়ে দেয়। উদাহরণস্বরূপ, যেকোনো ইংরেজি লোকেলে, প্রদর্শিত নামটি হলো “English (United States)”।
নোটিফিকেশন বার থেকে 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 রিটার্ন করে, তাহলে একটি সুইচিং কী প্রদর্শন করুন।
- যখন ব্যবহারকারী সুইচিং কী চাপেন, তখন `false` পাস করে
switchToNextInputMethod()কল করুন। `false` মানটি সিস্টেমকে নির্দেশ দেয় যে, সাবটাইপগুলো যে IME-এরই হোক না কেন, সেগুলোকে সমানভাবে বিবেচনা করতে হবে। `true` নির্দিষ্ট করলে সিস্টেমকে বর্তমান IME-এর মধ্যে থাকা সাবটাইপগুলোর মধ্যে দিয়ে চক্রাকারে যেতে হয়।
সাধারণ আইএমই বিবেচ্য বিষয়সমূহ
আপনার IME বাস্তবায়নের সময় আরও কিছু বিষয় বিবেচনা করতে হবে:
- ব্যবহারকারীদের জন্য সরাসরি IME-এর UI থেকে অপশন সেট করার একটি উপায় প্রদান করুন।
- ব্যবহারকারীদের জন্য ইনপুট মেথড UI থেকে সরাসরি অন্য একটি IME-তে পরিবর্তন করার একটি উপায় রাখুন, কারণ ডিভাইসে একাধিক IME ইনস্টল করা থাকতে পারে।
- IME-এর UI দ্রুত চালু করুন। যেকোনো বড় রিসোর্স আগে থেকে বা চাহিদা অনুযায়ী লোড করুন, যাতে ব্যবহারকারীরা কোনো টেক্সট ফিল্ডে ট্যাপ করার সাথে সাথেই IME দেখতে পান। ইনপুট মেথডের পরবর্তী ব্যবহারের জন্য রিসোর্স এবং ভিউ ক্যাশ করে রাখুন।
- ইনপুট মেথড উইন্ডোটি লুকানোর সাথে সাথেই বড় আকারের মেমরি বরাদ্দগুলো মুক্ত করে দিন, যাতে অ্যাপ্লিকেশনগুলো চলার জন্য পর্যাপ্ত মেমরি পায়। যদি IME কয়েক সেকেন্ডের জন্য লুকানো থাকে, তবে রিসোর্স মুক্ত করার জন্য একটি বিলম্বিত বার্তা ব্যবহার করুন।
- নিশ্চিত করুন যেন ব্যবহারকারীরা IME-এর সাথে যুক্ত ভাষা বা লোকেলের জন্য যতটা সম্ভব বেশি অক্ষর প্রবেশ করাতে পারেন। ব্যবহারকারীরা পাসওয়ার্ড বা ইউজার নেমে যতিচিহ্ন ব্যবহার করতে পারেন, তাই ব্যবহারকারীদের পাসওয়ার্ড প্রবেশ করিয়ে ডিভাইসটি অ্যাক্সেস করার সুযোগ দিতে আপনার IME-তে অবশ্যই বিভিন্ন ধরনের অক্ষরের ব্যবস্থা থাকতে হবে।