InputFilter, EditText'te görüntülenmeden önce girilen metni yakalamak ve değiştirmek için kullanılan bir Android SDK arayüzüdür. Geliştirici filtreleme kurallarını belirler: izin verilen karakterler, maksimum uzunluk, giriş formatı. Android Developers, 2026'ya göre InputFilter, harf, rakam ve özel karakter girişini kısıtlamak ve metni otomatik olarak biçimlendirmek için kullanılır. TextWatcher'ın aksine filtre, metin değişikliğinden önce tetiklenir ve kaynak düzeyinde hatalı girişi önler.
Önemli Noktalar
InputFilter, android.text paketinden tek bir filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) yöntemini tanımlayan işlevsel bir arayüzdür. Kullanıcı EditText'te metin yazmaya, yapıştırmaya veya değiştirmeye çalıştığında otomatik olarak çağrılır. Dönüş değeri, değişikliğin kabul edilip edilmeyeceğini, reddedileceğini veya değiştirileceğini belirler.
InputFilter'ın temel amacı, metin alana girmeden önce hatalı girişi önlemektir. Örneğin, telefon numarası rakam giriş alanında bir filtre harfleri ve özel karakterleri engelleyebilir. Parola alanında minimum uzunluk zorunlu kılabilir. Doğrulama kodu alanında yalnızca rakamlara izin verebilir. TextWatcher ile doğrulamanın aksine filtre, hatalı karakterlerin ekranda görünmesini engeller.
Android Developers'a göre InputFilter, TextInputEditText için tüm Material Design bileşenlerinde kullanılır. PhoneNumberFormattingTextWatcher gibi kütüphaneler, tam biçimlendirme için TextWatcher ve InputFilter'ı birleştirir. Hatalı girişe karşı ilk koruma bariyeri olarak InputFilter ve giriş sonrası ek mantık için TextWatcher kullanılması önerilir.
filter metodu altı parametre alır: source — girilen metin, start ve end — giriş parçasının sınırları, dest — alanın mevcut içeriği, dstart ve dend — ekleme konumu. Metod null döndürürse değişiklik olduğu gibi kabul edilir. Boş bir dize “” döndürürse değişiklik engellenir. Yeni bir CharSequence döndürürse orijinal metin döndürülen değerle değiştirilir.
Örneğin, bir kullanıcı yalnızca rakamlara izin veren bir alana “a” harfini yazmaya çalışırsa filtre “” döndürür ve karakter görünmez. “123” girilirse filtre, ayırıcılar ekleyerek “1-2-3” döndürebilir. Bu mekanizma, TextWatcher olmadan telefon numaralarının, tarihlerin ve diğer yapılandırılmış verilerin otomatik olarak biçimlendirilmesini sağlar.
Önemli: InputFilter orijinal veri kaynağını değiştirmez, yalnızca filtrelenmiş bir sürüm döndürür. Android, döndürülen değeri Editable'a kendisi uygular. Filtre null döndürürse ek bir işlem gerekmez. Değiştirilmiş metin döndürürse Android orijinal aralığı kaldırır ve yenisini ekler.
Android SDK, InputFilter'ın birkaç yerleşik uygulamasını sağlar. En yaygın olanı InputFilter.LengthFilter'dır ve maksimum metin uzunluğunu sınırlar. Yapıcı bir tamsayı — maksimum karakter sayısını kabul eder. Mevcut metin uzunluğu artı giriş sınırı aşarsa filtre, sınırın aşılmasını önleyerek kısaltılmış bir dize döndürür.
InputFilter.AllCaps da mevcuttur ve tüm giriş karakterlerini büyük harfe dönüştürür. Kod, posta kodu ve büyük/küçük harf durumunun önemli olduğu diğer verilerin alanlarında kullanılır. Filtre yalnızca küçük harfleri engellemekle kalmaz, aynı zamanda onları dönüştürür, bu da kullanıcı için uygundur — dönüştürme sonucunu görür.
Birden çok sınır için InputFilter.LengthFilter — filtrelerin bir kombinasyonu ile. Örneğin, uzunluğu 20 karakterle sınırlamanız ve yalnızca rakamlara izin vermeniz gerekiyorsa, LengthFilter + özel bir rakam filtresi uygulayabilirsiniz. Her filtre sırayla çalıştırılır ve bir öncekinin sonucu bir sonraki için dest olur.
| Filtre | Amaç | Kullanım Örneği |
|---|---|---|
| LengthFilter | Metin uzunluğu sınırlaması | 50 karaktere kadar isim alanı |
| AllCaps | Büyük harfe dönüştürme | Posta kodu alanı |
| Özel InputFilter | İsteğe bağlı filtreleme kuralları | Yalnızca rakamlar, özel karakterler yasak |
Özel filtre oluşturmak için InputFilter arayüzünü uygulamanız ve filter metodunu geçersiz kılmanız gerekir. Yaygın bir görev, yalnızca rakamlara izin veren bir filtredir. Bu durumda metod, Character.isDigit kullanarak source'daki her karakteri kontrol eder ve tüm karakterler geçerliyse filtrelenmiş bir dize veya null döndürü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
}
}
Bir örnek DigitsInputFilter, girilen metnin tüm karakterlerini dolaşır ve yalnızca rakamları tutar. Tüm karakterler kontrolü geçerse metod null döndürür — bu en uygun durumdur çünkü ek bellek işlemi gerektirmez. Bazı karakterler atılırsa yeni bir dize döndürülür ve EditText'e yalnızca rakamlar ulaşır.
Bir diğer popüler senaryo ise özel karakterleri engellemek için filtredir. Uygulama benzerdir: Character.isLetterOrDigit ile her karakteri kontrol etme veya izin verilen karakterler listesiyle karşılaştırma. Bu tür filtreler, kullanıcı adı alanları, arama dizeleri ve özel karakterlere izin verilmeyen diğer yerlerde kullanılır.
Filtreler, EditText'e setFilters(InputFilter[]) metodu aracılığıyla ayarlanır. Filtre dizisi mevcut filtrelerin yerini alır, bu nedenle mevcut filtrelerden birine ekleme yapmanız gerekiyorsa, mevcut filtreleri getFilters() ile almanız, yeni bir dizi oluşturmanız ve geri ayarlamanız gerekir. EditText'in varsayılan bir filtresi vardır — XML'de android:maxLength ile ayarlanan LengthFilter.
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
DigitsInputFilter(),
InputFilter.LengthFilter(10)
)
Örnekte iki filtre ayarlanmıştır: DigitsInputFilter (yalnızca rakamlar) ve LengthFilter (maksimum 10 karakter). Dizideki filtrelerin sırası önemlidir: ilk filtre orijinal girişi alır, işler ve sonucu ikinciye iletir. DigitsInputFilter bazı karakterleri filtreliyorsa, LengthFilter zaten filtrelenmiş metni görür ve uzunluk sınırlamasını buna uygular.
Filtreler ayrıca XML niteliği android:inputType aracılığıyla da ayarlanabilir, bu da otomatik olarak bazı filtreler ekler. Örneğin, inputType=“phone” DigitsKeyListener ekler ve yalnızca rakamlara ve bazı özel karakterlere izin verir. Ancak, filtreleme üzerinde tam kontrol için, özellikle birden çok kuralı birleştirirken, programlı olarak setFilters kullanılması önerilir.
InputFilter ve TextWatcher farklı işlevler görür ve genellikle birlikte kullanılır. InputFilter giriş düzeyinde çalışır — geçersiz karakterlerin alana girmesini engeller. TextWatcher girişten sonra çalışır — değişikliklere tepki vermeye, karmaşık doğrulama kurallarını gerçekleştirmeye ve kullanıcı arayüzünü güncellemeye olanak tanır. Her iki yaklaşımın birleşimi en iyi sonucu verir.
Örneğin, bir e-posta giriş alanı için: InputFilter giriş düzeyinde boşlukları ve Kiril karakterlerini engelleyebilirken, TextWatcher her değişiklikten sonra tam e-posta deseni uyumluluğunu kontrol edebilir. Birincisi bariz hatalara karşı korur, ikincisi yapısal hatalara karşı korur. Bu sorumluluk ayrımı kodu daha temiz hale getirir ve doğrulama yükünü azaltır.
Material Design Guidelines'a göre filtreler, katı kısıtlamaları olan alanlara uygulanmalıdır: telefon numaraları, doğrulama kodları, PIN kodları, posta kodları. Esnek doğrulamalı alanlar için — ad, adres, yorum — kullanıcıların meşru ancak standart olmayan değerler girmesini engellememek için yalnızca TextWatcher yeterlidir.
| Kriter | InputFilter | TextWatcher |
|---|---|---|
| Tetiklenme anı | Metin değişikliğinden önce | Metin değişikliğinden sonra |
| Amaç | Geçersiz karakterleri engelleme | Değişikliklere tepki, doğrulama, UI |
| Dönüş değeri | Filtrelenmiş metin veya null | Yok (void) |
| Uygulama | setFilters() | addTextChangedListener() |
Sıkça Sorulan Sorular
InputFilter metin değişikliğinden önce girişi yakalar ve engelleyebilir veya değiştirebilir. TextWatcher değişiklikten sonra çağrılır ve yeni değere tepki vermeye olanak tanır. InputFilter önleyici korumadır, TextWatcher ise son işlemedir. Tam form doğrulaması için her iki yaklaşımın da kullanılması önerilir.
setFilters() metoduna bir filtre dizisi iletin. Filtreler dizi sırasına göre sırayla çalıştırılır. Mevcut filtreleri kaybetmemek için bunları getFilters() ile alın, dizinin bir kopyasına yenilerini ekleyin ve setFilters ile geri ayarlayın. Halihazırda kurulu olan filtreleri dikkate almadan filtrelerin üzerine yazmayın.
Evet, InputFilter değiştirilmiş bir CharSequence döndürerek girişi değiştirebilir. Örneğin, bir telefon numarası filtresi boşluk veya parantez ekleyebilir. Ancak, karmaşık biçimlendirme için InputFilter'ı TextWatcher ile birleştirmek daha iyidir, çünkü filtre son işlemeden ziyade engellemeye odaklanmıştır.
Herhangi bir karakter: boşluklar, harfler, rakamlar, özel karakterler, Unicode karakterler. Özel bir filtrede, Character.isLetter, isDigit, isWhitespace kullanarak veya kara/beyaz listeyle karşılaştırarak koşulu tanımlarsınız. Filtre yalnızca Latin, yalnızca Kiril veya yalnızca belirli bir karakter kümesine izin verebilir.
Hayır, InputFilter yalnızca kullanıcı girişi veya pano yapıştırmasıyla tetiklenir. Metin setText() aracılığıyla programatik olarak ayarlanırsa filtreler uygulanmaz. Programatik metni kontrol etmek için TextWatcher doğrulaması veya ayarlamadan önce açık kontroller kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun