Android: DataBinding (Kotlin)

Recep Fırıncıoğlu
4 min readJul 25, 2021

--

Merhabalar bu yazıda android jetpack kütüphanesinin sunduğu özelliklerden biri olan data binding konusuna temel olarak değineceğim.

Data binding’in arkasındaki ana fikir, activity ve layout katmanlarını derleme zamanında (compile time) birbirine bağlayan/haritalayan bir nesne oluşturmaktır. Böylelikle uygulamanın çalışma zamanında hangi view’in hangi veriyle ilişkili olduğuna bakmak zorunda kalmaz ve işlem yükünü azaltmış oluruz. Bu bağlama işlemlerini yapan nesneye binding object denir ve derleyici tarafından oluşturulur.

Peki neye çözüm sunuyor ya da neyi kolaylaştırıyor? Şöyle ki komponentler üzerinden gerçekleştirilen değer atama işlemlerini veya çeşitli metodların kullanımlarını xml üzerinden referanslandırarak yönlendirme yapabilmemizi sağlıyor. Kotlin 1.40.20-M2 güncelleme notlarında Kotlin Android Extensions içerisinde kullanılan Synthetic import kullanımdan kaldırıldı. Oysa Synthetic kullanımı findViewById tanımlamalarından bizleri kurtarıp daha temiz görünümlü kodlar yazmamıza olanak sağlıyordu. Nedenlerine gelince şöyle sıralamışlar.

  • Global isimlendirmelerde kötü görünüyorlar.
  • Null değer (nullability) atamalarında bilgi göstermiyorlar.
  • Sadece Kotlin kodlarında çalışıyorlar.

Daha detaylı bilgiler için aşağıdaki blog bağlantısını inceleyebilirsiniz.

Peki Synthetic import yerine ne kullanacağız? Şimdilik 2 alternatifimiz var gibi görünüyor. findViewById ve Data Binding.

findViewById, her çağrıldığında view hiyerarşisini baştan sona taradığı için maliyetli bir işlemdir. Data Binding ile derleyici, <layout> içerisinde id’ye sahip olan her view için referans oluşturur ve bunların hepsini bir binding nesnesinin içerisinde saklar. Binding object üzerinden bir nesne oluşturup bu nesne üzerinden layout içerisindeki id referanslarıyla ekstra bir iş yüküne gerek duymadan viewlara erişebiliriz.

Data binding’i kullanabilmek için öncelikle build.graddle(:app) dosyasına aşağıdaki buildFeatures kod bloğunu eklemeliyiz.

android {
...
buildFeatures {
dataBinding true
}
}

Ardından activity_main.xml dosyamızda bulunan tüm kodları <layout> tag’i içerisine alıyoruz.

MainActivity.kt dosyamızda binding objesi oluşturuyoruz. Buradaki ActivityMainBinding, ViewDataBinding’i extend eden ve layout taginin eklenmesi ile oluşturulan bir classtır. Her zaman activity ismi+”Binding” şeklinde oluşturulur.

private lateinit var binding: ActivityMainBinding

Ardından onCreate metodu içerisinde setContentView’ı DataBindingUtil üzerinden inflate etmemiz gerekmekte. Böylelikle layout ile activity arasındaki bağlantıyı sağlamış oluyoruz. Aşağıdaki kod bloğu ile databinding nesnesini oluşturduğumuzda DataBindingUtil, andoridx.databinding kütüphanesinden otomatik olarak import edilecektir. Kütüphane import edilmediği takdirde aşağıdaki gibi bir uyarı ile karşılaşacaksınız.

binding = DataBindingUtil.setContentView(this,R.layout.activity_main)

Bu işlemlerin ardından artık binding nesnesi üzerinden layout içerisinde bulunan ve id’ye sahip olan tüm viewlara erişebilir olacaksınız.

binding.doneButton.setOnClickListener {
...

}

Gelelim Data binding’in asıl işlevine, data binding’in gerçek gücü xml’e veri bağlantısı yaptığımızda ortaya çıkıyor. Öyleyse bir view’ı data class’a nasıl bağladığımıza ve bu datanın view üzerinden nasıl doğrudan erişilebilir olduğuna bakalım.

Burada “name” ve “surname ” verilerini tutan PersonInformation adında bir data class oluşturuyoruz. Bu verileri string resources olarak tutmak yerine doğrudan data class üzerinde oluşturup view’a bağlayacağız.

activity_main.xml layout dosyamız üzerinden data class’a erişebilmek için <data> bloğu oluşturup bunun içerisinde <variable> bloğunda değişkenlerimizi tanımlayacağız.

Bu değişkene layout içerisinden erişebilmek için “info” ismini verip type ile de hangi class’a erişmesi gerektiğini belirtiyorum. name ve surname TextView’larını da aşağıdaki gibi güncelleyerek info isimli değişkenin name ve surname alanlarını işaret ediyorum.

Böylelikle, datalara referans veren aşağıdaki gibi bir yapı kurulmuş oluyor.

Sıra geldi data class’ımızın içerisini doldurmaya, bunun için MainActivity’de onCreate metodu altında data classımızın bir nesnesini oluşturarak name değişkenine değer ataması yapıyorum.

private val personInformation= PersonInformation("Recep")

Ardından onCreate içerisinde, oluşturduğum bu nesneyi layout altındaki info değişkenine atıyorum.

binding.info = personInformation

Artık xml dosyamız name ve surname bilgilerini doğrudan data class içerisinden almakta ve ekranda bunları kullanmakta. Data binding temel olarak bu kadardı. Aşağıdaki ekran görüntüleri ile uygulamanın neye benzediğini görebilirsiniz.

Aşağıdaki linkten ilgili GitHub reposuna erişebilir, kodları daha detaylı şekilde inceleyebilirsiniz. Yorum satırlarında Data Binding yerine findViewById ile de aynı uygulamayı nasıl yapabileceğinizi görebilirsiniz.

Android Data Binding temelleri GitHub

Kaynaklar:

Kotlin 1.4.20-M2 Güncelleme Notları

Google Data Binding Kütüphanesi

Google Data Binding Codelab

--

--