InputFilter Android SDK interfeysidir və daxil edilən mətnin EditText-də göstərilməzdən əvvəl onu yaxalamağa və dəyişdirməyə imkan verir. Tərtibatçı filtrasiya qaydalarını müəyyən edir: icazə verilən simvollar, maksimum uzunluq, daxiletmə formatı. Android Developers, 2026 məlumatlarına görə, InputFilter həriflərin, rəqəmlərin, xüsusi simvolların daxil edilməsini məhdudlaşdırmaq və mətnin avtomatik formatlaşdırılması üçün istifadə olunur. TextWatcher-dən fərqli olaraq, filtr mətn dəyişməzdən əvvəl işləyir və yanlış daxiletmənin mənbə səviyyəsində qarşısını alır.
Başlıca
InputFilter android.text paketindən olan funksional interfeysdir və tək bir filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) metodunu müəyyən edir. O, istifadəçi EditText-ə mətn daxil etməyə, yapışdırmağa və ya əvəz etməyə cəhd etdikdə avtomatik çağırılır. Qaytarılan dəyər dəyişikliyin qəbul ediləcəyini, rədd ediləcəyini və ya dəyişdiriləcəyini müəyyən edir.
InputFilter-in əsas təyinatı mətn sahəyə düşməzdən əvvəl yanlış daxiletmənin qarşısını almaqdır. Məsələn, telefon nömrəsi rəqəmlərinin daxil edilməsi sahəsində filtr həriflərin və xüsusi simvolların daxil edilməsini qadağan edə bilər. Şifrə sahəsində — minimum uzunluğu məhdudlaşdıra bilər. Təsdiq kodu sahəsində — yalnız rəqəmlərə icazə verə bilər. TextWatcher vasitəsilə validasiyadan fərqli olaraq, filtr səhv simvolların ekranda görünməsinə belə icazə vermir.
Android Developers məlumatlarına görə, InputFilter TextInputEditText üçün Material Design-ın bütün komponentlərində istifadə olunur. PhoneNumberFormattingTextWatcher kimi kitabxanalar tam formatlaşdırma üçün TextWatcher və InputFilter-i birləşdirir. InputFilter-dən yanlış daxiletməyə qarşı ilk maneə kimi, TextWatcher-dən isə daxiletmədən sonra əlavə məntiq üçün istifadə etmək tövsiyə olunur.
filter metodu altı parametr alır: source — daxil edilən mətn, start və end — daxil edilən fraqmentin sərhədləri, dest — sahənin cari məzmunu, dstart və dend — mətnin daxil edildiyi mövqe. Metod null qaytarırsa, dəyişiklik dəyişikliksiz qəbul edilir. Boş sətir “” qaytarırsa, dəyişiklik bloklanır. Yeni CharSequence qaytarırsa, orijinal mətn qaytarılanla əvəz olunur.
Məsələn, istifadəçi yalnız rəqəmlərə icazə verilən sahəyə “a” hərifini daxil etməyə cəhd edərsə, filtr “” qaytarır və simvol görünmür. “123” daxil edərsə, filtr “1-2-3” qaytararaq ayırıcılar əlavə edə bilər. Bu mexanizm TextWatcher iştirakı olmadan telefon nömrəsinin, tarixin və digər strukturlaşdırılmış məlumatların avtomatik formatlaşdırılmasını həyata keçirməyə imkan verir.
Vacib: InputFilter orijinal məlumat mənbəyini dəyişdirmir, yalnız filtrasiya olunmuş versiyanı qaytarır. Android özü qaytarılan dəyəri Editable-ə tətbiq edir. Filtr null qaytarırsa, əlavə tədbirlər tələb olunmur. Dəyişdirilmiş mətn qaytarırsa, Android orijinal diapazonu silir və yenisini daxil edir.
Android SDK InputFilter-ün bir neçə daxili tətbiqini təqdim edir. Ən geniş yayılmışı InputFilter.LengthFilter-dir, mətnin maksimum uzunluğunu məhdudlaşdırır. Konstruktor tam ədəd qəbul edir — maksimum simvol sayı. Cari mətnin uzunluğu daxiletmə nəzərə alınmaqla limiti keçərsə, filtr kəsilmiş sətir qaytarır və məhdudiyyətin keçilməsinə imkan vermir.
Həmçinin InputFilter.AllCaps mövcuddur, bütün daxil edilən simvolları böyük həriflərə çevirir. O, kodlar, poçt indeksləri və hərif qeydinin əhəmiyyətli olduğu digər məlumatlar üçün sahələrdə tətbiq olunur. Filtr yalnız kiçik hərifləri bloklamır, həm də onları çevirir, bu istifadəçi üçün əlverişlidir — çevirmə nəticəsini görür.
Bir neçə limit üçün InputFilter.LengthFilter — filtrlərin kombinasiyası vasitəsilə mövcuddur. Məsələn, uzunluğu 20 simvolla məhdudlaşdırmaq və yalnız rəqəmlərə icazə vermək lazımdırsa, LengthFilter + xüsusi rəqəm filtrini tətbiq etmək olar. Hər bir filtr ardıcıl yerinə yetirilir və əvvəlkinin nəticəsi sonrakı üçün dest olur.
| Filtr | Təyinat | İstifadə nümunəsi |
|---|---|---|
| LengthFilter | Mətnin uzunluğunu məhdudlaşdırma | 50 simvola qədər ad sahəsi |
| AllCaps | Böyük həriflərə çevirmə | Poçt indeksi sahəsi |
| Xüsusi InputFilter | İxtiyari filtrasiya qaydaları | Yalnız rəqəmlər, xüsusi simvollar qadağandır |
Xüsusi filtr yaratmaq üçün InputFilter interfeysini tətbiq etmək və filter metodunu dəyişdirmək lazımdır. Tez-tez rast gəlinən məsələ yalnız rəqəmlərə icazə verən filtrdir. Bu halda metod hər bir simvolu Character.isDigit vasitəsilə yoxlayır və filtrasiya olunmuş sətir və ya bütün simvollar icazəlidirsə null qaytarır.
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 filtri nümunəsi daxil edilən mətnin bütün simvollarından keçir və yalnız rəqəmləri saxlayır. Bütün simvollar yoxlamadan keçərsə, metod null qaytarır — bu optimal haldır, çünki əlavə yaddaş əməliyyatları tələb etmir. Simvolların bir hissəsi rədd edilərsə, yeni sətir qaytarılır və EditText-ə yalnız rəqəmlər düşür.
Digər populyar ssenari — xüsusi simvolları qadağan edən filtr. Tətbiq oxşardır: hər bir simvolun Character.isLetterOrDigit vasitəsilə yoxlanılması və ya icazə verilən simvollar siyahısı ilə müqayisəsi. Bu cür filtrlər istifadəçi adı, axtarış sətirləri və xüsusi simvolların icazə verilmədiyi digər yerlərdə istifadə olunur.
Filtrlər EditText-ə setFilters(InputFilter[]) metodu vasitəsilə qurulur. Filtrlər massivi cari olanları əvəz edir, ona görə mövcud filtrlərə yenisini əlavə etmək lazımdırsa, cari olanları getFilters() ilə əldə etmək, yeni massiv yaratmaq və onu geri qaytarmaq lazımdır. EditText-də standart olaraq XML-də android:maxLength vasitəsilə qurulan LengthFilter var.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
Nümunədə iki filtr qurulur: DigitsInputFilter (yalnız rəqəmlər) və LengthFilter (maksimum 10 simvol). Massivdə filtrlərin sırası əhəmiyyətlidir: birinci filtr orijinal daxiletməni alır, emal edir və nəticəni ikinciyə ötürür. DigitsInputFilter simvolların bir hissəsini filtr edərsə, LengthFilter artıq filtrasiya olunmuş mətni görür və öz uzunluq məhdudiyyətini ona tətbiq edir.
Filtrləri android:inputType XML atributu vasitəsilə də qurmaq olar, o avtomatik olaraq bəzi filtrləri əlavə edir. Məsələn, inputType="phone" DigitsKeyListener əlavə edir və yalnız rəqəmlərə və bəzi xüsusi simvollara icazə verir. Lakin filtrasiya üzərində tam nəzarət üçün, xüsusilə bir neçə qaydanı birləşdirmək lazım olduqda, setFilters proqram vasitəsilə istifadə etmək tövsiyə olunur.
InputFilter və TextWatcher müxtəlif funksiyaları yerinə yetirir və tez-tez birlikdə istifadə olunur. InputFilter daxiletmə səviyyəsində işləyir — yanlış simvolların sahəyə düşməsinə icazə vermir. TextWatcher daxiletmədən sonra işləyir — dəyişikliklərə reaksiya verməyə, mürəkkəb qaydaların validasiyasını yerinə yetirməyə və UI-ni yeniləməyə imkan verir. Hər iki yanaşmanın birləşməsi ən yaxşı nəticəni verir.
Məsələn, email daxiletmə sahəsi üçün: InputFilter daxiletmə səviyyəsində boşluqları və kiril əlifbasını qadağan edə bilər, TextWatcher isə hər dəyişiklikdən sonra email şablonuna tam uyğunluğu yoxlaya bilər. Birincisi aşkar səhvlərdən qoruyur, ikincisi — struktur səhvlərdən. Məsuliyyətin bu cür bölgüsü kodu təmizləyir və validasiya yükünü azaldır.
Material Design Guidelines məlumatlarına görə, filtrlər sərt məhdudiyyətləri olan sahələrə tətbiq edilməlidir: telefon nömrələri, təsdiq kodları, PIN-kodlar, poçt indeksləri. Yumşaq validasiyası olan sahələr üçün — ad, ünvan, şərh — istifadəçiyə qanuni, lakin qeyri-standart dəyərləri daxil etməyə mane olmamaq üçün TextWatcher kifayətdir.
| Meyar | InputFilter | TextWatcher |
|---|---|---|
| İşləmə vaxtı | Mətn dəyişməzdən əvvəl | Mətn dəyişdikdən sonra |
| Təyinat | Yanlış simvolları bloklama | Dəyişikliklərə reaksiya, validasiya, UI |
| Qaytarılan dəyər | Filtrasiya olunmuş mətn və ya null | Yox (void) |
| Tətbiq | setFilters() | addTextChangedListener() |
Tez-tez verilən suallar
InputFilter daxiletməni mətn dəyişməzdən əvvəl yaxalayır və onu bloklaya və ya dəyişdirə bilər. TextWatcher dəyişiklikdən sonra çağırılır və yeni dəyərə reaksiya verməyə imkan verir. InputFilter — profilaktik müdafiə, TextWatcher — sonrakı emal. Formanın tam validasiyası üçün hər iki yanaşmanın istifadəsi tövsiyə olunur.
Filtrlər massivini setFilters() metoduna ötürün. Filtrlər massiv sırası ilə ardıcıl yerinə yetirilir. Mövcud filtrləri itirməmək üçün, onları getFilters() ilə əldə edin, massivin surətinə yenisini əlavə edin və setFilters vasitəsilə geri qaytarın. Artıq qurulmuş filtrləri nəzərə almadan üzərinə yazmayın.
Bəli, InputFilter daxiletməni dəyişdirə, dəyişdirilmiş CharSequence qaytara bilər. Məsələn, telefon nömrəsi filtri boşluqlar və ya mötərizələr əlavə edə bilər. Lakin mürəkkəb formatlaşdırma üçün InputFilter-i TextWatcher ilə birləşdirmək daha yaxşıdır, çünki filtr bloklamaya yönəlib, sonrakı emala deyil.
İstənilən: boşluqlar, həriflər, rəqəmlər, xüsusi simvollar, Unicode simvolları. Xüsusi filtrdə Character.isLetter, isDigit, isWhitespace şərtini və ya qara/ağ siyahı ilə müqayisəni təyin edirsiniz. Filtr yalnız latın əlifbasına, yalnız kiril əlifbasına və ya yalnız müəyyən simvollar dəstinə icazə verə bilər.
Xeyr, InputFilter yalnız istifadəçi tərəfindən daxil edilmə və ya buferdən yapışdırma zamanı işləyir. Mətn setText() vasitəsilə proqramla qurulursa, filtrlər tətbiq edilmir. Proqram mətnini yoxlamaq üçün TextWatcher vasitəsilə validasiya və ya qurmadan əvvəl açıq yoxlamadan istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun