InputFilter bu Android SDK interfeysi bolib, kiritilayotgan matnni EditTextda korsatilishidan oldin uni ushlab qolish va ozgartirish imkonini beradi. Dasturchi filtrlash qoidalarini belgilaydi: ruxsat etilgan belgilar, maksimal uzunlik, kiritish formati. Android Developers, 2026 malumotlariga kora, InputFilter harflar, raqamlar, maxsus belgilarni kiritishni cheklash va matnni avtomatik formatlash uchun ishlatiladi. TextWatcherdan farqli olaroq, filtr matn ozgarishidan oldin ishlaydi va notogri kiritishni manba darajasida oldini oladi.
Asosiy
InputFilter android.text paketidagi funksional interfeys bolib, bitta filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) metodini belgilaydi. U foydalanuvchi EditTextga matn kiritishga, joylashtirishga yoki almashtirishga harakat qilganda avtomatik chaqiriladi. Qaytarilgan qiymat ozgarish qabul qilinishini, rad etilishini yoki ozgartirilishini belgilaydi.
InputFilterning asosiy vazifasi matn maydonga tushishidan oldin notogri kiritishning oldini olishdir. filter metodi olti parametr oladi: source — kiritilayotgan matn, start va end — kiritilayotgan fragment chegaralari, dest — maydonning joriy mazmuni, dstart va dend — matn kiritiladigan joy. Agar metod null qaytarsa, ozgarish ozgarishsiz qabul qilinadi. Agar bosh satr “” qaytarsa, ozgarish bloklanadi. InputFilter asl malumot manbasini ozgartirmaydi, faqat filtrlangan versiyani qaytaradi.
Masalan, foydalanuvchi faqat raqamlarga ruxsat etilgan maydonga “a” harfini kiritishga harakat qilsa, filtr “” qaytaradi va belgi kormaydi. “123” kiritsa, filtr “1-2-3” qaytarib, ajratgichlar qoshishi mumkin. InputFilter asl malumot manbasini ozgartirmaydi, faqat filtrlangan versiyani qaytaradi. Android ozgartirilgan matnni qaytarsa, asl diapazonni olib tashlaydi va yangisini kiritadi.
Android SDK InputFilterning bir nechta ichki tatbiqlarini taqdim etadi. Eng keng tarqalgani InputFilter.LengthFilter bolib, matnning maksimal uzunligini cheklaydi. InputFilter.AllCaps barcha kiritilgan belgilarni bosh harflarga aylantiradi.
| Filtr | Vazifasi | Foydalanish namunasi |
|---|---|---|
| LengthFilter | Matn uzunligini cheklash | 50 belgigacha ism maydoni |
| AllCaps | Bosh harflarga aylantirish | Pocht indeksi maydoni |
| Maxsus InputFilter | Ixtiyoriy filtrlash qoidalari | Faqat raqamlar, maxsus belgilar taqiqlangan |
Maxsus filtr yaratish uchun InputFilter interfeysini tatbiq etish va filter metodini ozgartirish kerak. DigitsInputFilter filtri namunasi kiritilayotgan matnning barcha belgilaridan otadi va faqat raqamlarni saqlaydi.
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
}
}
Yana bir ommabop stsenariy — maxsus belgilarni taqiqlovchi filtr. Bunday filtrlar foydalanuvchi nomi, qidiruv satrlari va maxsus belgilarga ruxsat berilmagan boshqa joylarda ishlatiladi.
Filtrlar EditTextga setFilters(InputFilter[]) metodi orqali urnatiladi. Filtrlar massivi joriy filtrlarni almashtiradi. Mavjud filtrlarga yangisini qoshish uchun ularni getFilters() bilan olish, yangi massiv yaratish va uni orqaga urnatish kerak.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
Misolda ikkita filtr urnatiladi: DigitsInputFilter (faqat raqamlar) va LengthFilter (maksimum 10 belgi). Filtrlarni android:inputType XML atributi orqali ham urnatish mumkin.
InputFilter va TextWatcher turli funktsiyalarni bajaradi va kopincha birgalikda ishlatiladi. InputFilter kiritish darajasida ishlaydi, TextWatcher esa kiritishdan keyin ishlaydi. Ikkala yondashuvning kombinatsiyasi eng yaxshi natijani beradi.
| Mezon | InputFilter | TextWatcher |
|---|---|---|
| Ishlash vaqti | Matn ozgarishidan oldin | Matn ozgarishidan keyin |
| Vazifasi | Notogri belgilarni bloklash | Ozgarishlarga reaksiya, validatsiya, UI |
| Qaytarilgan qiymat | Filtrlangan matn yoki null | Yoq (void) |
| Qollash | setFilters() | addTextChangedListener() |
Kop beriladigan savollar
InputFilter kiritishni matn ozgarishidan oldin ushlaydi va uni bloklashi yoki ozgartirishi mumkin. TextWatcher ozgarishdan keyin chaqiriladi va yangi qiymatga reaksiya berish imkonini beradi.
Filtrlar massivini setFilters() metodiga uzating. Filtrlar massiv tartibida ketma-ket bajariladi. Mavjud filtrlarni yoqotmaslik uchun ularni getFilters() bilan oling.
Ha, InputFilter kiritishni ozgartirishi, ozgartirilgan CharSequence qaytarishi mumkin. Murakkab formatlash uchun InputFilterni TextWatcher bilan birlashtirish tavsiya etiladi.
Istalgan: probellar, harflar, raqamlar, maxsus belgilar, Unicode belgilari. Filtr faqat lotin, faqat kirill yoki faqat muayyan belgilar toplamiga ruxsat berishi mumkin.
Yoq, InputFilter faqat foydalanuvchi kiritishi yoki buferdan joylashtirishda ishlaydi. Matn setText() orqali dasturiy urnatilsa, filtrlar qollanilmaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.