Kotlin Data Binding

Bu blog, Data Binding kitaplığının kullanımı için açıklamalar içermektedir.

Günümüzde modern bir uygulama oluştururken performans, bellek sızıntıları, render hızı ve daha fazlası gibi şeyleri hesaba katmak gerekir.

Data Binding, geliştiricilerin Android uygulamalarında render hızının yavaşlığını önleyen gelişmiş bir konudur. Data Binding kullanmanın bazı avantajları, bellek sızıntılarını veya nullPointerException gibi hataların önlenmesi, findViewById çağrılarının azaltılması ve Jetpack Compose kullanarak declarative UI oluşturmayı sağlamaktadır.

Bu eğitimde şunları ele alacağız:

Data Binding nedir?

Type safe ve null safe bir yaklaşımda görünümlere erişmek için Android uygulama geliştirmede benimsenen gelişmiş bir yaklaşımdır.

Veri bağlama, ilgili veri öğelerinin sayısına bağlı olarak basit veya karmaşık olabilir. Microsoft’a göre, basit bir veri bağlama, tek bir veri öğesini bağlayabilirken, karmaşık bir veri bağlama, birden çok veri öğesini bağlar. Veri bağlama ile, bir veri kümesindeki bir öğede yapılan değişiklik, veri kümesinin geri kalanını otomatik olarak günceller.

Şimdi ilgili kitaplığı proje içerisinde kullanabilmek için nasıl etkinleştirebileceğimize göz atacağız.

Android Uygulamasında Veri Bağlamayı Etkinleştirme

İlk olarak, veri bağlama kitaplığı ile çalışabilmek için geliştirme ortamımızı kurmamız gerekecek. Geliştirme ortamı kurulduktan sonra, veri bağlama kitaplığını etkinleştirelim. Bunu yapmak için, aşağıdaki kod parçacığında gösterildiği gibi app düzeyinde build.gradle dosyanızda veri bağlama oluşturma seçeneğini etkinleştirerek uygulamanızı yapılandırabilirsiniz.

android { ... 
      buildFeatures { 
       dataBinding true 
      } 
}
Module veya App düzeyinde build.gradle

Veri bağlama yaklaşımı, çalışma zamanında oluşturulduğunda veya yeniden oluşturulduktan sonra layout öğelerini bulup, değişiklik yapmayı sağlayan View Binding işleminden daha verimlidir.

Örnek Android Layout’u İçerisinde Data Binding Sınıfının Kullanılması

Veri bağlama yardımcı sınıfı, geniş layout dosyalarına sahip Android projeleri için çok kullanışlıdır. Yardımcı sınıf herhangi bir ek yük olmadan görünüme erişmemizi sağlar. Bu bölümde, Personal sınıfına veri bağlama eklemek için gerekli adımları göreceğiz.

Veri Bağlama findViewById‘den Nasıl Daha Hızlıdır?

Veri bağlamanın ardındaki fikir, iki uzak bilgiyi derleme zamanında birbirine bağlayan ve bunları çalışma zamanında kullanılabilir hale hale getiren nesneler oluşturmaktır. Böylece onları aramak ve tek tek güncellemek zorunda kalmazsınız. Kullanılabilir hale getirilen nesneler, derleyici tarafından oluşturulur ve bağlama nesnesi olarak adlandırılır.

Veri bağlama, aşağıdaki kod parçacığını kaldırmak kaldırmayı amaçlamaktadır.

findViewById(R.id.age).apply {
    text = viewModel.age
}

Daha etkili kullanımı, aşağıdaki kod parçasını kullanarak yapılmaktadır.

buildFeatures { 
       dataBinding true 
} 

Önceki bölümde anlatıldığı gibi app veya module düzeyinde build.gradle dosyasında dataBinding etkinleştirildikten sonra uygulayabiliriz.

İlk olarak, activite_main.xml içerisindeki tüm görünümleri bir <layout> etiketine sardığınızdan emin olun. Anlaşılabilir olmak için ilgili örneği aşağıya bırakıyorum.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <ConstraintLayout... /> <!-- UI layout's root element -->
</layout>

Ardından, aşağıdaki kod parçacığını kullanarak ana etkinlikte bir bağlama nesnesi oluşturun:

private lateinit var binding: ActivityMainBinding

Ardından, onCreate içerisinde içerik görünümünü ayarlamak için DataBindingUtil yardımcı sınıfını kullanın:

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

findViewById’e yapılan tüm çağrıları bağlama nesnesiyle değiştirin:

binding.doneButton.setOnClickListener

Görüntülemeyi düşündüğünüz veri kümesi için bir veri sınıfı oluşturun. Ben yukarıda bahsettiğim gibi Personal adında bir sınıf oluşturacağım:

data class Personal(var name: String = "", var age: String = "")

Ardından, activity_main.xml dosyasına bir data bloğunu ekleyebiliriz. Data bloğunu, ana(root) view etiketinden önce layout etiketinin içine ekleyin. Data bloğunun içine Personal sınıfı için bir değişken ekleyin:

<data>
<variable
    name="Personal"
    type="mobi.kodlayiruk.guide.model.Personal" />
</data>

nameText, ageEdit ve ageText görünümlerine text kaynağını parametre olarak alan başvurularla değiştirin, örneğin:

android:text="@={Personal.name}"

MainActivity sınıfı içerisinde Personal nesnesi oluşturalım:

private val personal: Personal = Personal("Elena Allison")

İlgili sınıfın içinde bulunan onCreate() metodu içerisinde layout’un içinde belirtilen data bloğunu eşleştirelim:

binding.Personal = personal

Binding Click Listener Kullanımı

Direk örnek kullanım ile nasıl kullanacağımızı göstermeye çalışacağım. Burada kullanacağımız ClickListener yardımcı sınıfı, onButtonClick() yönteminin tetiklenmesine ve o sırada layout içerisinde belirttiğimiz görünümün tıklanabilir olmasını sağlayacaktır:

interface ClickListener {
    fun onButtonClick(v: View?)
}

Ardından layout içerisini şu şekilde güncelleyelim:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="listener"
            type="mobi.kodlayiruk.guide.listener.ClickListener"/>
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="click me"
            android:onClick="@{listener.onButtonClick}"/>
    </RelativeLayout>
</layout>

Layout’u düzenledikten sonra kullanacağımız sınıf içerisinde ilgili arayüzü etkinleştirip, uygulayabiliriz:

class MainActivity : Activity(), ClickListener {
    private var binding: ActivityMainBinding? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.setListener(this)
    }

    fun onButtonClick(v: View?) {
        Toast.makeText(context, "Button clicked", Toast.LENGTH_LONG).show()
    }
}

Umarım blog, Veri bağlama yardımcı sınıfını anlamanıza yardımcı olmuştur. Aklınıza takılan soruların cevabını almak isterseniz dilerseniz yorumlara yazabilirsiniz. Ayrıca Android’in vermiş olduğu https://kotlinlang.org/docs/ dokümandan bilgi alabilirsiniz.

Bu arada diğer yazılarıma şuradan ulaşabiliyorsunuz 🙂 Mutlu Kodlamalar.