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 के अनुसार, InputFilter का उपयोग TextInputEditText के लिए सभी Material Design घटकों में किया जाता है। 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 — फ़िल्टर के संयोजन के माध्यम से। उदाहरण के लिए, यदि आपको लंबाई को 20 वर्णों तक सीमित करने और केवल अंकों की अनुमति देने की आवश्यकता है, तो आप LengthFilter + एक कस्टम अंक फ़िल्टर लागू कर सकते हैं। प्रत्येक फ़िल्टर क्रमिक रूप से निष्पादित होता है, और पिछले का परिणाम अगले के लिए dest बन जाता है।
| फ़िल्टर | उद्देश्य | उपयोग उदाहरण |
|---|---|---|
| LengthFilter | टेक्स्ट लंबाई प्रतिबंध | नाम फ़ील्ड 50 वर्णों तक |
| 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 (अधिकतम 10 वर्ण)। सरणी में फ़िल्टर का क्रम मायने रखता है: पहला फ़िल्टर मूल इनपुट प्राप्त करता है, इसे संसाधित करता है और परिणाम दूसरे को भेजता है। यदि 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 लौटाकर इनपुट को संशोधित कर सकता है। उदाहरण के लिए, एक फ़ोन नंबर फ़िल्टर स्थान या कोष्ठक जोड़ सकता है। हालांकि, जटिल फ़ॉर्मेटिंग के लिए, InputFilter को TextWatcher के साथ जोड़ना बेहतर है, क्योंकि फ़िल्टर पोस्ट-प्रोसेसिंग के बजाय ब्लॉक करने पर केंद्रित है।
कोई भी वर्ण: स्थान, अक्षर, अंक, विशेष वर्ण, यूनिकोड वर्ण। कस्टम फ़िल्टर में, आप Character.isLetter, isDigit, isWhitespace का उपयोग करके या ब्लैकलिस्ट/व्हाइटलिस्ट से तुलना करके शर्त निर्धारित करते हैं। फ़िल्टर केवल लैटिन, केवल सिरिलिक या केवल वर्णों का एक विशिष्ट सेट की अनुमति दे सकता है।
नहीं, InputFilter केवल उपयोगकर्ता इनपुट या क्लिपबोर्ड पेस्ट पर सक्रिय होता है। यदि टेक्स्ट setText() के माध्यम से प्रोग्रामेटिक रूप से सेट किया जाता है, तो फ़िल्टर लागू नहीं होते हैं। प्रोग्रामेटिक टेक्स्ट की जाँच के लिए, TextWatcher सत्यापन या सेट करने से पहले स्पष्ट जाँच का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें