একটি ইনপুট পদ্ধতি তৈরি করুন

ইনপুট মেথড এডিটর (IME) হল একটি ব্যবহারকারী নিয়ন্ত্রণ যা ব্যবহারকারীদের টেক্সট প্রবেশ করতে দেয়। অ্যান্ড্রয়েড একটি এক্সটেনসিবল ইনপুট-পদ্ধতি কাঠামো প্রদান করে যা অ্যাপ্লিকেশনগুলিকে ব্যবহারকারীদের বিকল্প ইনপুট পদ্ধতি, যেমন অন-স্ক্রিন কীবোর্ড বা স্পিচ ইনপুট প্রদান করতে দেয়। IME ইনস্টল করার পরে, ব্যবহারকারী সিস্টেম সেটিংস থেকে একটি নির্বাচন করতে পারেন এবং সমগ্র সিস্টেম জুড়ে এটি ব্যবহার করতে পারেন। একবারে শুধুমাত্র একটি IME সক্রিয় করা যেতে পারে।

অ্যান্ড্রয়েড সিস্টেমে একটি IME যোগ করতে, একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করুন যাতে একটি ক্লাস থাকে যা InputMethodService প্রসারিত করে। এছাড়াও, আপনি সাধারণত একটি "সেটিংস" কার্যকলাপ তৈরি করেন যা IME পরিষেবাতে বিকল্পগুলি প্রেরণ করে। আপনি একটি সেটিংস UIও সংজ্ঞায়িত করতে পারেন যা সিস্টেম সেটিংসের অংশ হিসাবে প্রদর্শিত হয়।

এই পৃষ্ঠাটি নিম্নলিখিত বিষয়গুলি কভার করে:

যদি আপনি IME গুলির সাথে কাজ না করে থাকেন, তাহলে প্রথমে অন-স্ক্রিন ইনপুট পদ্ধতি সম্পর্কে ভূমিকা নিবন্ধটি পড়ুন।

IME জীবনচক্র

নিম্নলিখিত চিত্রটি একটি IME এর জীবনচক্র বর্ণনা করে:

একটি IME-এর জীবনচক্র দেখানো একটি ছবি।
চিত্র ১. একটি IME এর জীবনচক্র।

নিম্নলিখিত বিভাগগুলিতে বর্ণনা করা হয়েছে যে কীভাবে এই জীবনচক্র অনুসরণকারী একটি IME-এর সাথে সম্পর্কিত UI এবং কোড বাস্তবায়ন করতে হয়।

ম্যানিফেস্টে IME উপাদানগুলি ঘোষণা করুন

অ্যান্ড্রয়েড সিস্টেমে, IME হল একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন যাতে একটি বিশেষ IME পরিষেবা থাকে। অ্যাপ্লিকেশনের ম্যানিফেস্ট ফাইলে পরিষেবাটি ঘোষণা করতে হবে, প্রয়োজনীয় অনুমতির অনুরোধ করতে হবে, action action.view.InputMethod সাথে মেলে এমন একটি ইন্টেন্ট ফিল্টার প্রদান করতে হবে এবং IME এর বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে এমন মেটাডেটা প্রদান করতে হবে। এছাড়াও, ব্যবহারকারীকে IME এর আচরণ পরিবর্তন করতে দেয় এমন একটি সেটিংস ইন্টারফেস প্রদান করতে, আপনি একটি "সেটিংস" কার্যকলাপ সংজ্ঞায়িত করতে পারেন যা সিস্টেম সেটিংস থেকে চালু করা যেতে পারে।

নিম্নলিখিত স্নিপেটটি একটি 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 থেকে এর সেটিংসে অ্যাক্সেস প্রদান করতে পারেন।

ইনপুট পদ্ধতি API

IME-এর জন্য নির্দিষ্ট ক্লাসগুলি android.inputmethodservice এবং android.view.inputmethod প্যাকেজগুলিতে পাওয়া যায়। KeyEvent ক্লাসটি কীবোর্ড অক্ষর পরিচালনার জন্য গুরুত্বপূর্ণ।

একটি IME এর কেন্দ্রীয় অংশ হল একটি পরিষেবা উপাদান - একটি ক্লাস যা InputMethodService প্রসারিত করে। স্বাভাবিক পরিষেবা জীবনচক্র বাস্তবায়নের পাশাপাশি, এই ক্লাসে আপনার IME এর UI প্রদান, ব্যবহারকারীর ইনপুট পরিচালনা এবং ফোকাসযুক্ত ক্ষেত্রে পাঠ্য সরবরাহ করার জন্য কলব্যাক রয়েছে। ডিফল্টরূপে, InputMethodService ক্লাস IME এর অবস্থা এবং দৃশ্যমানতা পরিচালনা এবং বর্তমান ইনপুট ক্ষেত্রের সাথে যোগাযোগের জন্য বেশিরভাগ বাস্তবায়ন প্রদান করে।

নিম্নলিখিত ক্লাসগুলিও গুরুত্বপূর্ণ:

BaseInputConnection
একটি InputMethod থেকে যোগাযোগ চ্যানেলকে সেই অ্যাপ্লিকেশনে ফেরত পাঠায় যা তার ইনপুট গ্রহণ করছে। আপনি এটি ব্যবহার করে কার্সারের চারপাশে টেক্সট পড়তে, টেক্সট বক্সে টেক্সট কমিট করতে এবং অ্যাপ্লিকেশনে raw কী ইভেন্ট পাঠাতে পারেন। অ্যাপ্লিকেশনগুলিকে বেস ইন্টারফেস 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-এর UI অবশ্যই বিভিন্ন স্ক্রিন আকারের জন্য স্কেল করতে সক্ষম হতে হবে এবং ল্যান্ডস্কেপ এবং পোর্ট্রেট উভয় দিকই পরিচালনা করতে হবে। নন-ফুলস্ক্রিন IME মোডে, অ্যাপ্লিকেশনটিতে টেক্সট ফিল্ড এবং সংশ্লিষ্ট প্রসঙ্গ দেখানোর জন্য পর্যাপ্ত জায়গা রাখুন, যাতে অর্ধেকের বেশি স্ক্রিন IME দ্বারা দখল না হয়। ফুলস্ক্রিন IME মোডে, এটি কোনও সমস্যা নয়।

বিভিন্ন ধরণের ইনপুট পরিচালনা করুন

অ্যান্ড্রয়েড টেক্সট ফিল্ড আপনাকে একটি নির্দিষ্ট ইনপুট টাইপ সেট করতে দেয়, যেমন ফ্রি-ফর্ম টেক্সট, নম্বর, URL, ইমেল ঠিকানা এবং অনুসন্ধান স্ট্রিং। যখন আপনি একটি নতুন IME বাস্তবায়ন করেন, তখন প্রতিটি ফিল্ডের ইনপুট টাইপ সনাক্ত করুন এবং এর জন্য উপযুক্ত ইন্টারফেস প্রদান করুন। তবে, ব্যবহারকারী ইনপুট টাইপের জন্য বৈধ টেক্সট প্রবেশ করান কিনা তা পরীক্ষা করার জন্য আপনাকে আপনার IME সেট আপ করতে হবে না। এটি টেক্সট ফিল্ডের মালিকানাধীন অ্যাপ্লিকেশনের দায়িত্ব।

উদাহরণস্বরূপ, ল্যাটিন IME অ্যান্ড্রয়েড প্ল্যাটফর্ম টেক্সট ইনপুটের জন্য যে ইন্টারফেসটি প্রদান করে তা এখানে দেওয়া হল:

ল্যাটিন IME-তে একটি টেক্সট ইনপুট দেখানো একটি ছবি
চিত্র ২। ল্যাটিন 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
সংখ্যা প্রবেশের জন্য একটি টেক্সট ফিল্ড। চিত্র ৩-এ দেখানো হয়েছে, ল্যাটিন IME এই ধরণের ফিল্ডের জন্য একটি নম্বর প্যাড প্রদর্শন করে।
TYPE_CLASS_DATETIME
তারিখ এবং সময় প্রবেশের জন্য একটি টেক্সট ফিল্ড।
TYPE_CLASS_PHONE
টেলিফোন নম্বর লেখার জন্য একটি টেক্সট ফিল্ড।
TYPE_CLASS_TEXT
যেকোনো সমর্থিত অক্ষর প্রবেশ করানোর জন্য একটি টেক্সট ফিল্ড।

এই ধ্রুবকগুলি InputType এর রেফারেন্স ডকুমেন্টেশনে আরও বিশদে বর্ণনা করা হয়েছে।

inputType ফিল্ডে অন্যান্য বিট থাকতে পারে যা টেক্সট ফিল্ড টাইপের একটি বৈকল্পিক নির্দেশ করে, যেমন:

TYPE_TEXT_VARIATION_PASSWORD
পাসওয়ার্ড প্রবেশের জন্য TYPE_CLASS_TEXT এর একটি রূপ। ইনপুট পদ্ধতিতে প্রকৃত লেখার পরিবর্তে ডিংব্যাট দেখানো হয়।
TYPE_TEXT_VARIATION_URI
ওয়েব URL এবং অন্যান্য ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (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 কমিট করে এবং একটি নতুন কার্সার অবস্থান সেট করে।

উদাহরণস্বরূপ, নিম্নলিখিত স্নিপেটে কার্সারের বাম দিকের চারটি অক্ষর "হ্যালো!" লেখা দিয়ে কীভাবে প্রতিস্থাপন করতে হয় তা দেখানো হয়েছে:

কোটলিন

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 ভাষা এবং মোড সনাক্ত করতে এবং তাদের মধ্যে স্যুইচ করতে সহায়তা করে।

<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" />

পরবর্তী স্নিপেটটি IME এর strings.xml ফাইলের অংশ। স্ট্রিং রিসোর্স label_subtype_generic , যা ইনপুট পদ্ধতি UI সংজ্ঞা দ্বারা সাবটাইপের লেবেল সেট করতে ব্যবহৃত হয়, তা নিম্নলিখিতভাবে সংজ্ঞায়িত করা হয়েছে:

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

এই সেটিংটি সাবটাইপের ডিসপ্লে নামকে লোকেল সেটিং এর সাথে মিলে যায়। উদাহরণস্বরূপ, যেকোনো ইংরেজি লোকেলে, ডিসপ্লে নাম হল "ইংরেজি (মার্কিন যুক্তরাষ্ট্র)।"

বিজ্ঞপ্তি বার থেকে IME সাবটাইপগুলি বেছে নিন।

অ্যান্ড্রয়েড সিস্টেম সকল IME দ্বারা প্রকাশিত সকল উপপ্রকার পরিচালনা করে। IME উপপ্রকারগুলিকে তাদের IME-এর মোড হিসেবে বিবেচনা করা হয়। ব্যবহারকারী বিজ্ঞপ্তি বার বা সেটিংস অ্যাপ থেকে উপলব্ধ IME উপপ্রকারের একটি মেনুতে নেভিগেট করতে পারেন, যেমনটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

ভাষা এবং ইনপুট সিস্টেম মেনু দেখানো একটি ছবি
চিত্র ৪। ভাষা ও ইনপুট সিস্টেম মেনু।

সিস্টেম সেটিংস থেকে IME সাবটাইপগুলি বেছে নিন

ব্যবহারকারী সিস্টেম সেটিংসের ভাষা এবং ইনপুট সেটিংস প্যানেলে কীভাবে সাবটাইপ ব্যবহার করা হবে তা নিয়ন্ত্রণ করতে পারেন:

ভাষা নির্বাচন মেনু দেখানো একটি ছবি
চিত্র ৫। ভাষা সিস্টেম মেনু

IME উপপ্রকারের মধ্যে স্যুইচ করুন

আপনি ব্যবহারকারীদের সহজেই IME সাবটাইপগুলির মধ্যে স্যুইচ করার সুযোগ দিতে পারেন, যেমন কীবোর্ডে গ্লোব-আকৃতির ভাষা আইকন। এটি কীবোর্ডের ব্যবহারযোগ্যতা উন্নত করে এবং ব্যবহারকারীর জন্য সুবিধাজনক। এই স্যুইচিং সক্ষম করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. ইনপুট পদ্ধতির XML রিসোর্স ফাইলগুলিতে Declare 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">
  2. shouldOfferSwitchingToNextInputMethod() পদ্ধতিটি কল করুন।
  3. যদি পদ্ধতিটি সত্য হয়, তাহলে একটি সুইচিং কী প্রদর্শন করুন।
  4. যখন ব্যবহারকারী সুইচিং কীটি ট্যাপ করে, তখন switchToNextInputMethod() কল করে false পাস করে। false এর মান সিস্টেমকে সকল উপ-প্রকারকে সমানভাবে বিবেচনা করতে বলে, তারা যে IME-এর অন্তর্ভুক্তই হোক না কেন। true নির্দিষ্ট করার জন্য সিস্টেমকে বর্তমান IME-এর উপ-প্রকারের মধ্য দিয়ে চক্রাকারে যেতে হয়।

সাধারণ IME বিবেচ্য বিষয়গুলি

আপনার IME বাস্তবায়নের সময় বিবেচনা করার জন্য এখানে অন্যান্য বিষয় রয়েছে:

  • ব্যবহারকারীদের IME এর UI থেকে সরাসরি বিকল্প সেট করার একটি উপায় প্রদান করুন।
  • ব্যবহারকারীদের ইনপুট পদ্ধতি UI থেকে সরাসরি একটি ভিন্ন IME-তে স্যুইচ করার একটি উপায় প্রদান করুন, কারণ ডিভাইসে একাধিক IME ইনস্টল করা থাকতে পারে।
  • IME এর UI দ্রুত চালু করুন। যেকোনো বড় রিসোর্স প্রিলোড করুন অথবা অন ডিমান্ড লোড করুন যাতে ব্যবহারকারীরা টেক্সট ফিল্ডে ট্যাপ করার সাথে সাথে IME দেখতে পান। ইনপুট পদ্ধতির পরবর্তী আমন্ত্রণের জন্য রিসোর্স এবং ভিউ ক্যাশে করুন।
  • ইনপুট পদ্ধতি উইন্ডো লুকানোর সাথে সাথেই বড় মেমোরি বরাদ্দ ছেড়ে দিন, যাতে অ্যাপ্লিকেশনগুলিতে চালানোর জন্য পর্যাপ্ত মেমোরি থাকে। যদি IME কয়েক সেকেন্ডের জন্য লুকানো থাকে তবে রিসোর্সগুলি প্রকাশ করতে বিলম্বিত বার্তা ব্যবহার করুন।
  • ব্যবহারকারীরা IME-এর সাথে সম্পর্কিত ভাষা বা লোকেলের জন্য যতটা সম্ভব অক্ষর লিখতে পারেন তা নিশ্চিত করুন। ব্যবহারকারীরা পাসওয়ার্ড বা ব্যবহারকারীর নামে বিরাম চিহ্ন ব্যবহার করতে পারেন, তাই ব্যবহারকারীদের পাসওয়ার্ড লিখতে এবং ডিভাইসটি অ্যাক্সেস করতে দেওয়ার জন্য আপনার IME-কে অনেকগুলি ভিন্ন অক্ষর সরবরাহ করতে হবে।