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

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

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

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

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

IME জীবনচক্র

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

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

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

ম্যানিফেস্টে 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>

এছাড়াও আপনি সরাসরি এর UI থেকে IME এর সেটিংসে অ্যাক্সেস প্রদান করতে পারেন।

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

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() কল করে যখন এটি প্রার্থীদের ভিউ প্রদর্শনের জন্য প্রস্তুত থাকে। এই পদ্ধতির আপনার বাস্তবায়নে, একটি লেআউট ফেরত দিন যা শব্দের পরামর্শ দেখায়, অথবা যদি আপনি কিছু দেখাতে না চান তাহলে শূন্য দিন। একটি নাল প্রতিক্রিয়া হল ডিফল্ট আচরণ, তাই আপনি যদি পরামর্শ প্রদান না করেন তবে আপনাকে এটি বাস্তবায়ন করতে হবে না।

UI ডিজাইন বিবেচনা

এই বিভাগটি IME-এর জন্য কিছু UI ডিজাইন বিবেচনার বর্ণনা দেয়।

একাধিক স্ক্রিন মাপ পরিচালনা করুন

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

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

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

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

একটি ল্যাটিন IME তে একটি পাঠ্য ইনপুট দেখানো একটি চিত্র৷
চিত্র 2. ল্যাটিন IME টেক্সট ইনপুট।

এবং এখানে ইন্টারফেসটি রয়েছে যা ল্যাটিন আইএমই অ্যান্ড্রয়েড প্ল্যাটফর্মের সাংখ্যিক ইনপুটের জন্য সরবরাহ করে:

একটি ল্যাটিন IME-এ একটি সংখ্যাসূচক ইনপুট দেখানো একটি চিত্র৷
চিত্র 3. ল্যাটিন 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
ওয়েব 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-এর একটি নির্দিষ্ট সাব-টাইপ আনতে দেয়। আপনি যখন একটি আইএমই তৈরি করেন, সাব-টাইপ সুবিধা ব্যবহার করুন, কারণ এটি ব্যবহারকারীকে বিভিন্ন আইএমই ভাষা এবং মোড সনাক্ত করতে এবং পরিবর্তন করতে সহায়তা করে।

<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 সাব-টাইপগুলির একটি মেনুতে নেভিগেট করতে পারেন, যেমনটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

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

সিস্টেম সেটিংস থেকে IME সাবটাইপ নির্বাচন করুন

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

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

IME সাবটাইপের মধ্যে পরিবর্তন করুন

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

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

সাধারণ IME বিবেচনা

আপনার IME বাস্তবায়ন করার সময় এখানে অন্যান্য বিষয়গুলি বিবেচনা করতে হবে:

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

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

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

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

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

IME জীবনচক্র

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

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

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

ম্যানিফেস্টে 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>

এছাড়াও আপনি সরাসরি এর UI থেকে IME এর সেটিংসে অ্যাক্সেস প্রদান করতে পারেন।

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

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() কল করে যখন এটি প্রার্থীদের ভিউ প্রদর্শনের জন্য প্রস্তুত থাকে। এই পদ্ধতির আপনার বাস্তবায়নে, একটি লেআউট ফেরত দিন যা শব্দের পরামর্শ দেখায়, অথবা যদি আপনি কিছু দেখাতে না চান তাহলে শূন্য দিন। একটি নাল প্রতিক্রিয়া হল ডিফল্ট আচরণ, তাই আপনি যদি পরামর্শ প্রদান না করেন তবে আপনাকে এটি বাস্তবায়ন করতে হবে না।

UI ডিজাইন বিবেচনা

এই বিভাগটি IME-এর জন্য কিছু UI ডিজাইন বিবেচনার বর্ণনা দেয়।

একাধিক স্ক্রিন মাপ পরিচালনা করুন

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

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

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

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

একটি ল্যাটিন IME তে একটি পাঠ্য ইনপুট দেখানো একটি চিত্র৷
চিত্র 2. ল্যাটিন IME টেক্সট ইনপুট।

এবং এখানে ইন্টারফেসটি রয়েছে যা ল্যাটিন আইএমই অ্যান্ড্রয়েড প্ল্যাটফর্মের সাংখ্যিক ইনপুটের জন্য সরবরাহ করে:

একটি ল্যাটিন IME-এ একটি সংখ্যাসূচক ইনপুট দেখানো একটি চিত্র৷
চিত্র 3. ল্যাটিন 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
ওয়েব 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-এর একটি নির্দিষ্ট সাব-টাইপ আনতে দেয়। আপনি যখন একটি আইএমই তৈরি করেন, সাব-টাইপ সুবিধা ব্যবহার করুন, কারণ এটি ব্যবহারকারীকে বিভিন্ন আইএমই ভাষা এবং মোড সনাক্ত করতে এবং পরিবর্তন করতে সহায়তা করে।

<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 সাব-টাইপগুলির একটি মেনুতে নেভিগেট করতে পারেন, যেমনটি নিম্নলিখিত চিত্রে দেখানো হয়েছে:

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

সিস্টেম সেটিংস থেকে IME সাবটাইপ নির্বাচন করুন

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

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

IME সাবটাইপের মধ্যে পরিবর্তন করুন

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

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

সাধারণ IME বিবেচনা

আপনার IME বাস্তবায়ন করার সময় এখানে অন্যান্য বিষয়গুলি বিবেচনা করতে হবে:

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

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

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

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

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

IME জীবনচক্র

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

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

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

ম্যানিফেস্টে 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>

এছাড়াও আপনি সরাসরি এর UI থেকে IME এর সেটিংসে অ্যাক্সেস প্রদান করতে পারেন।

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

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

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

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

BaseInputConnection
InputMethod থেকে যোগাযোগের চ্যানেলটিকে সংজ্ঞায়িত করে যা তার ইনপুট গ্রহণ করছে এমন অ্যাপ্লিকেশনটিতে ফিরে আসে। আপনি এটি কার্সারের চারপাশে পাঠ্য পড়তে, পাঠ্য বাক্সে পাঠ্য প্রতিশ্রুতিবদ্ধ এবং অ্যাপ্লিকেশনটিতে কাঁচা কী ইভেন্টগুলি প্রেরণ করতে এটি ব্যবহার করেন। অ্যাপ্লিকেশনগুলি অবশ্যই বেস ইন্টারফেস InputConnection প্রয়োগের পরিবর্তে এই শ্রেণিটি প্রসারিত করতে হবে।
KeyboardView
View একটি এক্সটেনশন যা একটি কীবোর্ডকে রেন্ডার করে এবং ব্যবহারকারী ইনপুট ইভেন্টগুলিতে সাড়া দেয়। কীবোর্ড লেআউটটি Keyboard একটি উদাহরণ দ্বারা নির্দিষ্ট করা হয়েছে, যা আপনি একটি এক্সএমএল ফাইলে সংজ্ঞায়িত করতে পারেন।

ইনপুট পদ্ধতি ইউআই ডিজাইন করুন

আইএমইর জন্য দুটি প্রধান ভিজ্যুয়াল উপাদান রয়েছে: ইনপুট ভিউ এবং প্রার্থীদের ভিউ। আপনি কেবল এমন উপাদানগুলি প্রয়োগ করতে হবে যা আপনি ডিজাইন করছেন এমন ইনপুট পদ্ধতির সাথে প্রাসঙ্গিক।

ইনপুট ভিউ

ইনপুট ভিউ হ'ল ইউআই যেখানে ব্যবহারকারী কীক্লিকস, হস্তাক্ষর বা অঙ্গভঙ্গি আকারে পাঠ্য ইনপুট করে। যখন আইএমই প্রথমবারের জন্য প্রদর্শিত হয়, সিস্টেমটি onCreateInputView() কলব্যাককে কল করে। এই পদ্ধতিটি আপনার বাস্তবায়নে, আইএমই উইন্ডোতে আপনি যে বিন্যাসটি প্রদর্শন করতে চান তা তৈরি করুন এবং সিস্টেমে লেআউটটি ফিরিয়ে দিন। নিম্নলিখিত স্নিপেটটি 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 রেন্ডার করে।

প্রার্থীরা দেখুন

প্রার্থীদের ভিউ হ'ল ইউআই যেখানে আইএমই ব্যবহারকারী নির্বাচন করার জন্য সম্ভাব্য শব্দ সংশোধন বা পরামর্শ প্রদর্শন করে। আইএমই লাইফসাইকেলে, সিস্টেমটি যখন প্রার্থীদের ভিউ প্রদর্শন করতে প্রস্তুত তখন onCreateCandidatesView() কে কল করে। আপনার এই পদ্ধতিটি বাস্তবায়নে, এমন একটি বিন্যাস ফিরিয়ে দিন যা শব্দের পরামর্শগুলি দেখায়, বা আপনি কিছু দেখাতে না চাইলে নালটি ফিরিয়ে দিন। একটি নাল প্রতিক্রিয়া হ'ল ডিফল্ট আচরণ, সুতরাং আপনি পরামর্শ না দিলে আপনাকে এটি প্রয়োগ করতে হবে না।

ইউআই ডিজাইন বিবেচনা

এই বিভাগটি আইএমইগুলির জন্য কিছু ইউআই ডিজাইনের বিবেচনার বর্ণনা দেয়।

একাধিক স্ক্রিন আকার পরিচালনা করুন

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

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

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

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

একটি চিত্র একটি ল্যাটিন আইএমইতে একটি পাঠ্য ইনপুট দেখায়
চিত্র 2. ল্যাটিন আইএমই পাঠ্য ইনপুট।

এবং এখানে ল্যাটিন আইএমই অ্যান্ড্রয়েড প্ল্যাটফর্মের সংখ্যার ইনপুট সরবরাহ করে এমন ইন্টারফেসটি এখানে:

একটি চিত্র একটি লাতিন আইএমইতে একটি সংখ্যাসূচক ইনপুট দেখায়
চিত্র 3. ল্যাটিন আইএমই সংখ্যার ইনপুট।

যখন কোনও ইনপুট ক্ষেত্র ফোকাস গ্রহণ করে এবং আপনার আইএমই শুরু হয়, সিস্টেমটি onStartInputView() কল করে, একটি EditorInfo অবজেক্টে পাস করে যা ইনপুট টাইপ এবং পাঠ্য ক্ষেত্রের অন্যান্য বৈশিষ্ট্য সম্পর্কে বিশদ ধারণ করে। এই অবজেক্টে, inputType ক্ষেত্রটিতে পাঠ্য ক্ষেত্রের ইনপুট প্রকার রয়েছে।

inputType ক্ষেত্রটি এমন একটি int যা বিভিন্ন ইনপুট টাইপ সেটিংসের জন্য বিট প্যাটার্ন ধারণ করে। পাঠ্য ক্ষেত্রের ইনপুট ধরণের জন্য এটি পরীক্ষা করতে, এটি যেমন ধ্রুবক TYPE_MASK_CLASS দিয়ে মাস্ক করুন:

কোটলিন

inputType and InputType.TYPE_MASK_CLASS

জাভা

inputType & InputType.TYPE_MASK_CLASS

ইনপুট টাইপ বিট প্যাটার্নটিতে বেশ কয়েকটি মানের একটি থাকতে পারে, সহ:

TYPE_CLASS_NUMBER
সংখ্যা প্রবেশের জন্য একটি পাঠ্য ক্ষেত্র। চিত্র 3 -তে চিত্রিত হিসাবে, লাতিন আইএমই এই ধরণের ক্ষেত্রগুলির জন্য একটি নম্বর প্যাড প্রদর্শন করে।
TYPE_CLASS_DATETIME
একটি তারিখ এবং সময় প্রবেশের জন্য একটি পাঠ্য ক্ষেত্র।
TYPE_CLASS_PHONE
টেলিফোন নম্বর প্রবেশের জন্য একটি পাঠ্য ক্ষেত্র।
TYPE_CLASS_TEXT
যে কোনও সমর্থিত অক্ষর প্রবেশের জন্য একটি পাঠ্য ক্ষেত্র।

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

inputType ক্ষেত্রটিতে অন্যান্য বিট থাকতে পারে যা পাঠ্য ক্ষেত্রের ধরণের একটি বৈকল্পিক নির্দেশ করে, যেমন:

TYPE_TEXT_VARIATION_PASSWORD
পাসওয়ার্ড প্রবেশের জন্য TYPE_CLASS_TEXT একটি বৈকল্পিক। ইনপুট পদ্ধতিটি প্রকৃত পাঠ্যের পরিবর্তে ডিংব্যাটগুলি প্রদর্শন করে।
TYPE_TEXT_VARIATION_URI
ওয়েব ইউআরএল এবং অন্যান্য ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (ইউআরআই) প্রবেশের জন্য TYPE_CLASS_TEXT একটি বৈকল্পিক।
TYPE_TEXT_FLAG_AUTO_COMPLETE
টেক্সট প্রবেশের জন্য TYPE_CLASS_TEXT একটি বৈকল্পিক যা অ্যাপ্লিকেশনটি কোনও অভিধান, অনুসন্ধান বা অন্যান্য সুবিধা থেকে স্বয়ংক্রিয়ভাবে সমাপ্ত হয়।

আপনি যখন এই রূপগুলির জন্য পরীক্ষা করেন তখন উপযুক্ত ধ্রুবক সহ ইনপুট টাইপ মাস্ক inputType । উপলভ্য মাস্ক ধ্রুবকগুলি InputType জন্য রেফারেন্স ডকুমেন্টেশনে তালিকাভুক্ত করা হয়েছে।

অ্যাপ্লিকেশনটিতে পাঠ্য প্রেরণ করুন

ব্যবহারকারী আপনার আইএমই দিয়ে পাঠ্য ইনপুট হিসাবে, আপনি পৃথক কী ইভেন্টগুলি প্রেরণ করে বা অ্যাপ্লিকেশনটির পাঠ্য ক্ষেত্রে কার্সারের চারপাশে পাঠ্য সম্পাদনা করে অ্যাপ্লিকেশনটিতে পাঠ্য পাঠাতে পারেন। উভয় ক্ষেত্রেই, পাঠ্য সরবরাহ করতে 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);

প্রতিশ্রুতিবদ্ধ হওয়ার আগে রচনা রচনা সমর্থন

যদি আপনার আইএমই পাঠ্যের পূর্বাভাস দেয় বা গ্লাইফ বা শব্দটি রচনা করার জন্য একাধিক পদক্ষেপের প্রয়োজন হয় তবে ব্যবহারকারী শব্দটি না করা পর্যন্ত আপনি পাঠ্য ক্ষেত্রে অগ্রগতি প্রদর্শন করতে পারেন এবং তারপরে আপনি সম্পূর্ণ পাঠ্যের সাথে আংশিক রচনাটি প্রতিস্থাপন করতে পারেন। আপনি যখন 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);

ইন্টারসেপ্ট হার্ডওয়্যার কী ইভেন্টগুলি

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

হার্ডওয়্যার কীগুলি বাধা দিতে, ওভাররাইড onKeyDown() এবং onKeyUp()

আপনি যে কীগুলি নিজেকে পরিচালনা করতে চান না তার জন্য super() পদ্ধতিটি কল করুন।

একটি আইএমই সাব টাইপ তৈরি করুন

সাব টাইপগুলি আইএমই একটি আইএমই দ্বারা সমর্থিত একাধিক ইনপুট মোড এবং ভাষাগুলি প্রকাশ করতে দেয়। একটি সাব টাইপ নিম্নলিখিত প্রতিনিধিত্ব করতে পারে:

  • একটি লোকেল, যেমন এন_উস বা fr_fr
  • একটি ইনপুট মোড, যেমন ভয়েস, কীবোর্ড বা হস্তাক্ষর
  • অন্যান্য ইনপুট শৈলী, ফর্ম বা আইএমই সম্পর্কিত নির্দিষ্ট বৈশিষ্ট্য যেমন 10-কী বা কিওয়ার্টি কীবোর্ড লেআউট

মোডটি কোনও পাঠ্য হতে পারে, যেমন "কীবোর্ড" বা "ভয়েস"। একটি সাব টাইপ এগুলির সংমিশ্রণও প্রকাশ করতে পারে।

সাব টাইপ তথ্য একটি আইএমই স্যুইচার ডায়ালগের জন্য ব্যবহৃত হয় যা বিজ্ঞপ্তি বার থেকে পাওয়া যায় এবং আইএমই সেটিংসের জন্য। তথ্যটি ফ্রেমওয়ার্কটিকে সরাসরি একটি আইএমইর একটি নির্দিষ্ট সাব টাইপ আনতে দেয়। আপনি যখন কোনও আইএমই তৈরি করেন, সাব টাইপ সুবিধাটি ব্যবহার করুন, কারণ এটি ব্যবহারকারীকে বিভিন্ন আইএমই ভাষা এবং মোডগুলির মধ্যে সনাক্ত করতে এবং স্যুইচ করতে সহায়তা করে।

<subtype> উপাদানটি ব্যবহার করে ইনপুট পদ্ধতির এক্সএমএল রিসোর্স ফাইলগুলির মধ্যে একটিতে সাব টাইপগুলি সংজ্ঞায়িত করুন। নিম্নলিখিত কোড স্নিপেট দুটি সাব টাইপ সহ একটি আইএমই সংজ্ঞায়িত করে: মার্কিন ইংলিশ লোকেলের জন্য একটি কীবোর্ড সাব টাইপ এবং ফ্রান্সের জন্য ফরাসি ভাষার লোকেলের জন্য অন্য কীবোর্ড সাব টাইপ:

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

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

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

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

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

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

বিজ্ঞপ্তি বার থেকে আইএমই সাব টাইপগুলি চয়ন করুন

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

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

সিস্টেম সেটিংস থেকে আইএমই সাব টাইপগুলি চয়ন করুন

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

ভাষা নির্বাচন মেনু দেখায় একটি চিত্র
চিত্র 5. ভাষা সিস্টেম মেনু

আইএমই সাব টাইপগুলির মধ্যে স্যুইচ করুন

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

  1. ইনপুট পদ্ধতির এক্সএমএল রিসোর্স ফাইলগুলিতে 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() কল করুন। মিথ্যাটির একটি মান সিস্টেমকে সমস্ত সাব -টাইপকে সমানভাবে চিকিত্সা করার জন্য বলে, তারা যে আইএমই এর অন্তর্ভুক্ত তা নির্বিশেষে। সত্য নির্দিষ্ট করার জন্য সিস্টেমটি বর্তমান আইএমইতে সাব টাইপগুলির মাধ্যমে চক্রের প্রয়োজন।

সাধারণ আইএমই বিবেচনা

আপনি আপনার আইএমই বাস্তবায়নের সাথে সাথে বিবেচনা করার জন্য এখানে অন্যান্য বিষয়গুলি এখানে রয়েছে:

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