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 انٹرفیس لاگو کرنا ہوگا اور filter طریقہ کو اوور رائڈ کرنا ہوگا۔ ایک عام کام ایک فلٹر ہے جو صرف ہندسوں کی اجازت دیتا ہے۔ اس صورت میں، طریقہ 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 کے ذریعے ہر حرف کی جانچ یا اجازت یافتہ حروف کی فہرست سے موازنہ۔ اس طرح کے فلٹرز صارف نام کے فیلڈز، تلاش کے سٹرنگز اور دیگر جگہوں پر استعمال ہوتے ہیں جہاں خصوصی حروف کی اجازت نہیں ہے۔
فلٹرز EditText پر setFilters(InputFilter[]) طریقہ کے ذریعے سیٹ کیے جاتے ہیں۔ فلٹرز کی صف موجودہ فلٹرز کو بدل دیتی ہے، لہٰذا اگر آپ کو موجودہ فلٹرز میں ایک فلٹر شامل کرنے کی ضرورت ہے، تو آپ کو 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 ان پٹ کے بعد کام کرتا ہے — یہ تبدیلیوں پر ردعمل ظاہر کرنے، پیچیدہ توثیقی قواعد انجام دینے اور یوزر انٹرفیس کو اپ ڈیٹ کرنے کی اجازت دیتا ہے۔ دونوں طریقوں کا امتزاج بہترین نتیجہ دیتا ہے۔
مثال کے طور پر، ای میل ان پٹ فیلڈ کے لیے: InputFilter ان پٹ کی سطح پر خالی جگہوں اور سیریلک حروف کو روک سکتا ہے، جبکہ TextWatcher ہر تبدیلی کے بعد مکمل ای میل پیٹرن کی تعمیل کی جانچ کر سکتا ہے۔ پہلا واضح غلطیوں سے بچاتا ہے، دوسرا ساختی غلطیوں سے۔ ذمہ داریوں کی یہ علیحدگی کوڈ کو صاف ستھرا بناتی ہے اور توثیق کا بوجھ کم کرتی ہے۔
Material Design Guidelines کے مطابق، فلٹرز سخت پابندیوں والے فیلڈز پر لگائے جائیں: فون نمبر، تصدیقی کوڈ، PIN کوڈ، پوسٹل کوڈ۔ نرم توثیق والے فیلڈز کے لیے — نام، پتہ، تبصرہ — صرف 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں