InputFilter হল Android SDK-এর একটি ইন্টারফেস যা EditText-এ প্রদর্শনের আগে ইনপুট টেক্সট আটকানো এবং পরিবর্তন করার অনুমতি দেয়। ডেভেলপার ফিল্টারিং নিয়ম নির্ধারণ করে: অনুমোদিত অক্ষর, সর্বোচ্চ দৈর্ঘ্য, ইনপুট ফরম্যাট। Android Developers, 2026-এর মতে, InputFilter অক্ষর, সংখ্যা, বিশেষ চিহ্নের ইনপুট সীমাবদ্ধ করতে এবং টেক্সট স্বয়ংক্রিয়ভাবে ফর্ম্যাট করতে ব্যবহৃত হয়। TextWatcher-এর বিপরীতে, ফিল্টার টেক্সট পরিবর্তনের আগে সক্রিয় হয়, যা উৎস স্তরে ভুল ইনপুট প্রতিরোধ করে।
মূল বিষয়
InputFilter হল android.text প্যাকেজের একটি কার্যকরী ইন্টারফেস যা একটি একক পদ্ধতি filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) সংজ্ঞায়িত করে। এটি প্রতিবার স্বয়ংক্রিয়ভাবে কল হয় যখন ব্যবহারকারী EditText-এ টেক্সট টাইপ, পেস্ট বা প্রতিস্থাপন করার চেষ্টা করে। ফেরত মান নির্ধারণ করে যে পরিবর্তনটি গ্রহণ, প্রত্যাখ্যান বা পরিবর্তিত হবে কিনা।
InputFilter-এর প্রধান উদ্দেশ্য হল টেক্সট ফিল্ডে প্রবেশের আগে ভুল ইনপুট প্রতিরোধ করা। উদাহরণস্বরূপ, ফোন নম্বর অঙ্ক ইনপুট ফিল্ডে, একটি ফিল্টার অক্ষর এবং বিশেষ চিহ্ন ব্লক করতে পারে। পাসওয়ার্ড ফিল্ডে, এটি ন্যূনতম দৈর্ঘ্য প্রয়োগ করতে পারে। ভেরিফিকেশন কোড ফিল্ডে, এটি শুধুমাত্র অঙ্ক অনুমতি দিতে পারে। TextWatcher-এর মাধ্যমে বৈধতার বিপরীতে, ফিল্টার ভুল অক্ষরগুলিকে স্ক্রিনে উপস্থিত হতে বাধা দেয়।
Android Developers-এর মতে, TextInputEditText-এর জন্য সমস্ত Material Design কম্পোনেন্টে InputFilter ব্যবহৃত হয়। PhoneNumberFormattingTextWatcher-এর মতো লাইব্রেরিগুলি সম্পূর্ণ ফর্ম্যাটিংয়ের জন্য TextWatcher এবং InputFilter একত্রিত করে। ভুল ইনপুটের বিরুদ্ধে প্রথম প্রতিরোধক হিসেবে InputFilter এবং ইনপুট-পরবর্তী অতিরিক্ত যুক্তির জন্য TextWatcher ব্যবহার করার পরামর্শ দেওয়া হয়।
ফিল্টার পদ্ধতি ছয়টি প্যারামিটার গ্রহণ করে: source — ইনপুট টেক্সট, start এবং end — ইনপুট খণ্ডের সীমা, dest — ফিল্ডের বর্তমান বিষয়বস্তু, dstart এবং dend — সন্নিবেশ অবস্থান। যদি পদ্ধতি null ফেরত দেয়, পরিবর্তনটি অপরিবর্তিতভাবে গ্রহণ করা হয়। যদি এটি একটি খালি স্ট্রিং “” ফেরত দেয়, পরিবর্তনটি ব্লক করা হয়। যদি এটি একটি নতুন CharSequence ফেরত দেয়, মূল টেক্সটটি ফেরত দেওয়া মান দ্বারা প্রতিস্থাপিত হয়।
উদাহরণস্বরূপ, যদি কোনো ব্যবহারকারী এমন একটি ফিল্ডে অক্ষর “a” টাইপ করার চেষ্টা করে যা শুধুমাত্র অঙ্ক অনুমতি দেয়, ফিল্টারটি “” ফেরত দেয় এবং অক্ষরটি প্রদর্শিত হয় না। যদি “123” প্রবেশ করানো হয়, ফিল্টারটি বিভাজক যোগ করে “1-2-3” ফেরত দিতে পারে। এই প্রক্রিয়াটি TextWatcher ছাড়াই ফোন নম্বর, তারিখ এবং অন্যান্য কাঠামোবদ্ধ ডেটার স্বয়ংক্রিয় ফর্ম্যাটিং সক্ষম করে।
গুরুত্বপূর্ণ: InputFilter মূল ডেটা উৎস পরিবর্তন করে না, এটি শুধুমাত্র একটি ফিল্টার করা সংস্করণ ফেরত দেয়। Android নিজেই ফেরত দেওয়া মান Editable-এ প্রয়োগ করে। যদি ফিল্টার null ফেরত দেয়, কোনো অতিরিক্ত কাজের প্রয়োজন নেই। যদি এটি পরিবর্তিত টেক্সট ফেরত দেয়, Android মূল পরিসর সরিয়ে নতুনটি সন্নিবেশ করে।
Android SDK InputFilter-এর বেশ কয়েকটি অন্তর্নির্মিত বাস্তবায়ন প্রদান করে। সবচেয়ে সাধারণ হল InputFilter.LengthFilter, যা সর্বোচ্চ টেক্সট দৈর্ঘ্য সীমিত করে। কনস্ট্রাক্টর একটি পূর্ণসংখ্যা গ্রহণ করে — সর্বোচ্চ অক্ষর সংখ্যা। যদি বর্তমান টেক্সট দৈর্ঘ্য এবং ইনপুট সীমা অতিক্রম করে, ফিল্টারটি একটি ছোট স্ট্রিং ফেরত দেয়, যা সীমা অতিক্রম করা প্রতিরোধ করে।
InputFilter.AllCapsও উপলব্ধ, যা সমস্ত ইনপুট অক্ষরকে বড় হাতের অক্ষরে রূপান্তর করে। এটি কোড, পিন কোড এবং অন্যান্য ডেটার ফিল্ডে ব্যবহৃত হয় যেখানে কেস গুরুত্বপূর্ণ। ফিল্টারটি শুধু ছোট হাতের অক্ষর ব্লক করে না বরং সেগুলিকে রূপান্তর করে, যা ব্যবহারকারীর জন্য সুবিধাজনক — তারা রূপান্তরের ফলাফল দেখতে পায়।
একাধিক সীমার জন্য InputFilter.LengthFilter — ফিল্টারের সমন্বয়ের মাধ্যমে। উদাহরণস্বরূপ, যদি আপনাকে দৈর্ঘ্য ২০ অক্ষরে সীমাবদ্ধ করতে এবং শুধুমাত্র অঙ্ক অনুমতি দিতে হয়, আপনি LengthFilter + একটি কাস্টম অঙ্ক ফিল্টার প্রয়োগ করতে পারেন। প্রতিটি ফিল্টার ক্রমানুসারে কার্যকর হয় এবং আগেরটির ফলাফল পরবর্তীটির জন্য dest হয়ে যায়।
| ফিল্টার | উদ্দেশ্য | ব্যবহারের উদাহরণ |
|---|---|---|
| LengthFilter | টেক্সট দৈর্ঘ্য সীমাবদ্ধতা | নাম ফিল্ড ৫০ অক্ষর পর্যন্ত |
| AllCaps | বড় হাতের অক্ষরে রূপান্তর | পিন কোড ফিল্ড |
| কাস্টম InputFilter | ইচ্ছামতো ফিল্টারিং নিয়ম | শুধুমাত্র অঙ্ক, বিশেষ চিহ্ন নিষিদ্ধ |
কাস্টম ফিল্টার তৈরি করতে, আপনাকে InputFilter ইন্টারফেস বাস্তবায়ন করতে হবে এবং ফিল্টার পদ্ধতি ওভাররাইড করতে হবে। একটি সাধারণ কাজ হল একটি ফিল্টার যা শুধুমাত্র অঙ্ক অনুমতি দেয়। এই ক্ষেত্রে, পদ্ধতিটি Character.isDigit ব্যবহার করে source-এর প্রতিটি অক্ষর পরীক্ষা করে এবং একটি ফিল্টার করা স্ট্রিং বা null ফেরত দেয় যদি সব অক্ষর বৈধ হয়।
class DigitsInputFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence? {
val sb = StringBuilder()
for (i in start until end) {
val c = source?.get(i)
if (c != null && Character.isDigit(c)) {
sb.append(c)
}
}
return if (sb.length == end - start) null else sb
}
}
একটি উদাহরণ DigitsInputFilter ইনপুট টেক্সটের সমস্ত অক্ষরের মধ্য দিয়ে যায় এবং শুধুমাত্র অঙ্ক রাখে। যদি সব অক্ষর পরীক্ষায় পাস করে, পদ্ধতিটি null ফেরত দেয় — এটি সর্বোত্তম ক্ষেত্রে কারণ এতে অতিরিক্ত মেমরি অপারেশনের প্রয়োজন হয় না। যদি কিছু অক্ষর বাদ দেওয়া হয়, একটি নতুন স্ট্রিং ফেরত দেওয়া হয় এবং শুধুমাত্র অঙ্ক EditText-এ পৌঁছায়।
আরেকটি জনপ্রিয় পরিস্থিতি হল বিশেষ চিহ্ন ব্লক করার ফিল্টার। বাস্তবায়ন একই: Character.isLetterOrDigit এর মাধ্যমে প্রতিটি অক্ষর পরীক্ষা করা বা অনুমোদিত অক্ষরের তালিকার সাথে তুলনা করা। এই ধরনের ফিল্টার ব্যবহারকারীর নাম ফিল্ড, অনুসন্ধান স্ট্রিং এবং অন্যান্য স্থানে ব্যবহৃত হয় যেখানে বিশেষ চিহ্ন অনুমোদিত নয়।
ফিল্টারগুলি setFilters(InputFilter[]) পদ্ধতি-এর মাধ্যমে EditText-এ সেট করা হয়। ফিল্টার অ্যারে বর্তমান ফিল্টারগুলি প্রতিস্থাপন করে, তাই যদি আপনাকে বিদ্যমান ফিল্টারগুলিতে একটি ফিল্টার যোগ করতে হয়, তবে আপনাকে getFilters()-এর মাধ্যমে বর্তমান ফিল্টারগুলি পেতে হবে, একটি নতুন অ্যারে তৈরি করতে হবে এবং এটি আবার সেট করতে হবে। EditText-এ একটি ডিফল্ট ফিল্টার রয়েছে — LengthFilter, যা XML-এ android:maxLength-এর মাধ্যমে সেট করা হয়।
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
উদাহরণে, দুটি ফিল্টার সেট করা হয়েছে: DigitsInputFilter (শুধুমাত্র অঙ্ক) এবং LengthFilter (সর্বোচ্চ ১০ অক্ষর)। অ্যারেতে ফিল্টারের ক্রম গুরুত্বপূর্ণ: প্রথম ফিল্টার মূল ইনপুট গ্রহণ করে, এটি প্রক্রিয়া করে এবং ফলাফল দ্বিতীয়টিতে পাঠায়।�দি DigitsInputFilter কিছু অক্ষর ফিল্টার করে, LengthFilter ইতিমধ্যে ফিল্টার করা টেক্সট দেখে এবং এতে তার দৈর্ঘ্য সীমা প্রয়োগ করে।
XML অ্যাট্রিবিউট android:inputType-এর মাধ্যমেও ফিল্টার সেট করা যেতে পারে, যা স্বয়ংক্রিয়ভাবে কিছু ফিল্টার যোগ করে। উদাহরণস্বরূপ, inputType=“phone” DigitsKeyListener যোগ করে এবং শুধুমাত্র অঙ্ক এবং কিছু বিশেষ চিহ্ন অনুমতি দেয়। তবে, ফিল্টারিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণের জন্য, বিশেষ করে একাধিক নিয়ম একত্রিত করার সময়, প্রোগ্রামেটিকভাবে setFilters ব্যবহার করার পরামর্শ দেওয়া হয়।
InputFilter এবং TextWatcher ভিন্ন কার্য সম্পাদন করে এবং প্রায়শই একসাথে ব্যবহৃত হয়। InputFilter ইনপুট স্তরে কাজ করে — এটি ভুল অক্ষরগুলিকে ফিল্ডে প্রবেশ করতে বাধা দেয়। TextWatcher ইনপুটের পরে কাজ করে — এটি পরিবর্তনে সাড়া দিতে, জটিল বৈধতা নিয়ম সম্পাদন করতে এবং UI আপডেট করতে দেয়। উভয় পদ্ধতির সংমিশ্রণ সর্বোত্তম ফলাফল দেয়।
উদাহরণস্বরূপ, একটি ইমেল ইনপুট ফিল্ডের জন্য: InputFilter ইনপুট স্তরে স্পেস এবং সিরিলিক অক্ষর ব্লক করতে পারে, যখন TextWatcher প্রতিটি পরিবর্তনের পরে সম্পূর্ণ ইমেল প্যাটার্ন সামঞ্জস্য পরীক্ষা করতে পারে। প্রথমটি সুস্পষ্ট ত্রুটি থেকে রক্ষা করে, দ্বিতীয়টি কাঠামোগত ত্রুটি থেকে। দায়িত্বের এই পৃথকীকরণ কোড পরিষ্কার করে এবং বৈধতার বোঝা কমায়।
Material Design Guidelines-এর মতে, কঠোর সীমাবদ্ধতা সহ ফিল্ডে ফিল্টার প্রয়োগ করা উচিত: ফোন নম্বর, ভেরিফিকেশন কোড, পিন কোড, পিন কোড। নমনীয় বৈধতা সহ ফিল্ডের জন্য — নাম, ঠিকানা, মন্তব্য — শুধুমাত্র TextWatcher যথেষ্ট যাতে ব্যবহারকারীদের বৈধ কিন্তু অ-মানক মান প্রবেশ করতে বাধা না দেয়।
| মানদণ্ড | InputFilter | TextWatcher |
|---|---|---|
| সক্রিয়করণ মুহূর্ত | টেক্সট পরিবর্তনের আগে | টেক্সট পরিবর্তনের পরে |
| উদ্দেশ্য | ভুল অক্ষর ব্লক করা | পরিবর্তনে সাড়া, বৈধতা, UI |
| ফেরত মান | ফিল্টার করা টেক্সট বা null | কিছুই না (void) |
| প্রয়োগ | setFilters() | addTextChangedListener() |
সচরাচর জিজ্ঞাসা
InputFilter টেক্সট পরিবর্তনের আগে ইনপুট আটকায় এবং এটি ব্লক বা পরিবর্তন করতে পারে। TextWatcher পরিবর্তনের পরে কল করা হয় এবং নতুন মানে সাড়া দিতে দেয়। InputFilter প্রতিরোধমূলক সুরক্ষা, TextWatcher পোস্ট-প্রসেসিং। সম্পূর্ণ ফর্ম বৈধতার জন্য, উভয় পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হয়।
setFilters() পদ্ধতিতে ফিল্টারের একটি অ্যারে পাস করুন। ফিল্টারগুলি অ্যারে ক্রমে ক্রমানুসারে কার্যকর হয়। বিদ্যমান ফিল্টার হারানো এড়াতে, সেগুলি getFilters()-এর মাধ্যমে পান, অ্যারের একটি কপিতে নতুন যোগ করুন এবং setFilters-এর মাধ্যমে আবার সেট করুন। ইতিমধ্যে ইনস্টল করা ফিল্টারগুলি বিবেচনা না করে ফিল্টার ওভাররাইট করবেন না।
হ্যাঁ, InputFilter একটি পরিবর্তিত CharSequence ফেরত দিয়ে ইনপুট পরিবর্তন করতে পারে। উদাহরণস্বরূপ, একটি ফোন নম্বর ফিল্টার স্পেস বা বন্ধনী যোগ করতে পারে। তবে, জটিল ফর্ম্যাটিংয়ের জন্য, TextWatcher-এর সাথে InputFilter একত্রিত করা ভাল, কারণ ফিল্টার পোস্ট-প্রসেসিংয়ের পরিবর্তে ব্লক করার উপর কেন্দ্রিত।
যেকোনো অক্ষর: স্পেস, অক্ষর, সংখ্যা, বিশেষ চিহ্ন, ইউনিকোড অক্ষর। কাস্টম ফিল্টারে, আপনি Character.isLetter, isDigit, isWhitespace ব্যবহার করে বা কালো/সাদা তালিকার সাথে তুলনা করে শর্ত নির্ধারণ করেন। ফিল্টারটি শুধুমাত্র ল্যাটিন, শুধুমাত্র সিরিলিক বা শুধুমাত্র একটি নির্দিষ্ট অক্ষর সেটের অনুমতি দিতে পারে।
না, InputFilter শুধুমাত্র ব্যবহারকারীর ইনপুট বা ক্লিপবোর্ড পেস্টে সক্রিয় হয়। যদি setText()-এর মাধ্যমে টেক্সট প্রোগ্রামেটিকভাবে সেট করা হয়, ফিল্টারগুলি প্রয়োগ হয় না। প্রোগ্রামেটিক টেক্সট পরীক্ষা করার জন্য, TextWatcher বৈধতা বা সেট করার আগে স্পষ্ট পরীক্ষা ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন