Android DataBinding (Temel Seviye)

Barış Algül
3 min readAug 3, 2021

--

DataBinding Nedir?

DataBinding adından da anlaşılabileceği gibi veri bağlama işlemidir. Konuyu biraz daha açmak gerekirse; verilerle yapılan işlemlerde arayüze veriyi daha temiz ve daha anlaşılır şekilde aktarabilmemizi sağlayan bir JetPack kütüphanesidir. DataBinding, boilerplate(gereksiz) kod yazımından bizi kurtaran kütüphanelerden birisidir. Alttaki görsel kısaca ne anlatmak istediğimi ifade ediyor. Eski yöntemde findViewById ile layout’ta tanımlanmış olan view’a bir id değeri tanımlayarak Activity’den buna erişmeye çalışırdık. Erişimden sonra bu view’a ilgili değeri .setText ya da .text ile set ederdik. Artık ise tek satır kod ile bu değeri view’a bind edebiliyoruz.

DataBinding Nasıl Kullanılır?

Bu kütüphane build.gradle(modül seviyesinde) üzerinde aktifleştirilerek uygulama içinde kullanabilir hale getirilebilir.

android {
...
buildFeatures {
dataBinding true
}
}

DataBinding işlemini uygulamak istediğiniz layout’unuzu <layout> etiketi içine almanız gerekir.

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

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

</layout>

Bu işlemi yaptıktan sonra layout’un bağlı olduğu Activity sınıfı açıp DataBinding’i sınıfınıza tanımlamanız gerekmektedir. Bu işlemin yapılmasının sebebi sınıfta yapılan veri değişiklikleri layout’ta bulunan view’lara bildirilmesidir.

class MainActivity : AppCompatActivity() {

private var activityMainBinding: ActivityMainBinding? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

activityMainBinding = DataBindingUtil.setContentView(
this, R.layout.activity_main
)
}
}

Şimdi ise örnek amaçlı basit bir sınıf oluşturalım.

package com.barisalgul.databindingexample

class Person(var name: String)

Oluşturduğumuz Person sınıfından kullanacağımız sınıf içerisinde bir tane nesne üretelim. Parametre olarak name adında String tipinde bir parametre istiyoruz. Bu parametreyi de set edelim.

class MainActivity : AppCompatActivity() {

private var activityMainBinding: ActivityMainBinding? = null
var person: Person? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

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

person = Person("Barış")
}
}

Şimdi ise oluşturduğumuz layout’a data’yı bind edebilmek için layout içerisinde tanımlama yapacağız.

<layout>

</layout>

etiketlerinin arasına aşağıdaki şekilde data tanımlaması yapıyoruz.

<data>
<variable
name="person"
type="com.barisalgul.databindingexample.Person" />
</data>

<data> etiketlerinin arasına da hangi sınıf ile çalışmak istiyorsak <variable/> etiketiyle bunu belirtiyoruz. name attribute’u ile kullanacağımız bu sınıfı bu layout içerisinde hangi isimle çağıracağımızı belirtiyoruz. type attribute’u ile de hangi sınıfı kullanacağımızı belirtiyoruz.

Projeyi build ettikten sonra çalıştığımız Activity sınıfına dönüyoruz.

Parametre değerini verdikten sonra bu nesneyi önceden oluşturmuş olduğumuz binding nesnemize (activityMainBinding) set edelim.

class MainActivity : AppCompatActivity() {

private var activityMainBinding: ActivityMainBinding? = null
var person: Person? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

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

person = Person("Barış")
activityMainBinding?.person = person
}
}

Örneğin artık layout içerisinde herhangi bir view’ın text attribute’une “@{person.name}” yazarak bu onCreate’te set ettiğimiz verimizi view üzerinde görüntüleyebiliriz. Gelecek olan data’nın null olması durumunda ise null olarak görünüm sağlanacaktır. Bunu da önlemek adına default değer tanımlayabiliyoruz. Örneğin;

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{person.name, default=@string/defaultError}" />

Uygulama açıldığı anda person nesnesindeki name değeri TextView’a herhangi bir id değerine ihtiyaç duymadan ve viewBinding yapmadan set edilebiliyor. Eski yöntemle bu görünümün aynısını yapmak isteseydik ya findViewById ile TextView’a bir id verip oradan ulaşmaya çalışacaktık ya da viewBinding yaptıktan sonra view’a .setText ya da .text fonksiyonu ile set edecektik.

Peki ya TextView’daki text değerini değiştirmek istersek?

Örnek bir uygulama üzerinden gidelim; layout’umuza bir buton ekleyelim. Butonun özellikleri de bu şekilde olsun;

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:onClick="changeName"
android:text="Change Name"
android:textAllCaps="false" />

Activity’de oluşturacağımız changeName fonksiyonunu butona tıklandığı zaman çağıralım.

fun changeName(view: View) {
person?.name = "Barış Can"
activityMainBinding?.person = person
}

person nesnemiz global bir değişken olduğu için bu scope içinden de erişebiliriz. Daha sonra içindeki name property’sinin değerini yeniden set edip bu nesneyi tekrardan activityMainBinding nesnemize set etmiş olduk. Artık butona tıklandığında TextView’ın text değerinin değiştiğini görebiliriz.

Başka bir yazıda görüşmek üzere, hoşça kalın…

--

--