Androidde Extension Kullanımı
Extension functions, mevcut sınıflara yeni işlevsellik eklemeni sağlar; bu sayede, sınıfın kaynak kodunu değiştirmeden ekstra metotlar ekleyebiliriz.
Örnek A: Toast Mesajını Extension Olarak Tanımlama
Normalde, Android'de bir Toast göstermek için şöyle bir kod yazıyoruz:
Toast.makeText(context, "Mesaj", Toast.LENGTH_SHORT).show()
Bu kodu her seferinde tekrarlamak yerine, Context sınıfına bir extension function ekleyerek daha okunaklı bir yapı oluşturabiliriz:
fun Context.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
Bu extension fonksiyonu sayesinde artık herhangi bir Context örneği üzerinden doğrudan şu şekilde çağrı yapabiliriz:
// Örneğin bir Activity içinde:
showToast("Merhaba, bu toast mesajı extension ile gösterilmiştir!")
Özet A
- fun Context.showToast(...):
Bu şekilde, Context sınıfına yeni bir metot eklemiş oluyoruz.
this, fonksiyonun çağrıldığı Context nesnesine referanstır.
- Varsayılan Parametre:
duration: Int = Toast.LENGTH_SHORT ile, mesajın gösterim süresi varsayılan olarak kısa sürede belirlenmiştir.
Ayrıca mesajımızın string olacağını da burada belirtiyoruz
- Kullanım Kolaylığı:
Artık her yerde Toast.makeText(...) kullanmaya gerek kalmadan, sadece showToast("Mesaj") yazarak hızlıca mesaj gösterebilirsin.
Örnek B: dp to px Extension Fonksiyonu
Android'de tasarım yaparken boyutları dp (density-independent pixels) cinsinden belirtiriz çünkü bu, farklı ekran yoğunluklarına göre uyum sağlar.
Ancak, bazı durumlarda gerçek piksel değerlerine ihtiyacımız olur. Bu fonksiyon, dp değerini, cihazın ekran yoğunluğuna (density) göre piksele çevirir.
Özetle: dp değeri * ekran yoğunluğu = piksel değeri.
Şimdi bu işi extension ile nasıl yapacağımızı görelim:
fun Context.dpToPx(dp: Int): Int {
return (dp * resources.displayMetrics.density).toInt()
}
Herhangi bir aktivite veya fragment içerisinde bu fonksiyonu kullanmak için:
val marginInPx = applicationContext.dpToPx(16)
Özet B
-
resources.displayMetrics.density ifadesi, cihazın ekran yoğunluğunu verir.
-
dp * density sonucu, dp'nin piksel karşılığını verir ve toInt() ile tamsayıya dönüştürülür.
Extensionları daha birçok alanda, birçok farklı şekilde kullanabiliriz.