Android Kotlin DataBinding

Fırat Uckan
2 min readDec 7, 2020

Handler, One-Way, Two-Way

Herkese Merhabalar,

Bir önceki yazımda Kotlin ile ilgili Mvvm yapısını ve DataBinding den bahsetmiştim. Bu yazımda ise sık sık kullandığımız 3 terime değinmek istiyorum. Bu arada bir önceki yazıma buradan ulaşabilirsiniz.

Bu üç terim için ortak bir viewModel hazırladım.Xml içerisinde buraya erişeceğimizi belirtmek zorundayız.

<data>
<variable name="model" type="com.example.mvvm_onewayandtwowaydatabinding.MainViewModel"/>
</data>

Handler :

Android de birşeyler yazmaya başlayınca ve bunu Mvvm yapısında geliştirince gerçekten gerek kod okunabilirliği gerek bakım açısından çok sağlıklı olduğunu gördüm.

Bir Buton için bir işlevsellik kazandırmak için basit bir sınıf yazılabilir ve bu butonun onClick eventinden tetiklenerek aksiyon aldırabiliriz. Bir örnek kullanımını kısaca özetlemek istiyorum

<Button
android:text="test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> model.getPassWord()}"/>

Butonumuzun onClick eventine <data> teglerinde belirtiğimiz yola gideceğimizi söylüyoruz ve burası bir fonksiyon olmalıdır.

MainViewModel.kt sınıfındaki fonksiyonumuz aşağıdaki işi yapmaktadır.

fun getPassWord() {
exampleText?.set("example one way binding")
}

Burada butona tıklandığı zaman textview string değer yazdırılıyor.

One-Way:

Tek yönlü veri bağlama anlamında gelir .Örnek olarak observe ettiğimiz bir datanın view yani kullanıcı arayüz kısmında yansımasını sağlar. Tam tersi bir durum söz konusu değildir.

Kullanımı :

Aslında Buton için yazdığımız örnek One-Way kullanıma örnek oluyor diyebiliriz. observe ettiğimiz datayı onClick eventi ile view a bildiriyoruz.

<TextView
android:text="@{model.exampleText}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

Kullanırken android:text=”@{}” şeklinde tanımlamalıyız.

Two-Way:

İki yönlü veri bağlama anlamına gelir. Örnek uygulamamız üzerinden gidersek : kullanıcı şifre girmeye başladığından itibaren observe edip istediğimiz şartlar oluştuğunda kullanıcıya anında o şifrenin uygun olup olmadığını dönmemizi sağlar.

Kullanımı :

Buradaki yaptığımız örnek aslında bu konuyu anlamak için uygun bir örnek. Kullanıcıdan bir şifre istiyoruz ve kullanıcı parola girmeye başladığından itibaren her karakteri gözlemleyip uygun bir parola olup olmadığını bildiriyoruz.

Şimdi akıllardaki soru muhtemelen One-Way binding ile bunun yapmanın mümkün olup olmadığı . Evet aslında One-Way binding ile de yapılabilir ancak bu biraz masraflı olur . Bir adet TextWatcher yazılıp orası dinlerek işlem yapılabilir ama dediğim gibi biraz masraflı burası için.

<EditText
android:text="@={model.password}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="18dp"
android:minWidth="200dp"/>

<TextView
android:text="@{model.getPasswordQuality}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

Kullanırken android:text=”@={}” şeklinde tanımlamalıyız.

@Bindable("password")
fun getPasswordQuality(): String {
return if (this.password?.get().toString().isEmpty()) {
"Enter a password"
} else if (this.password?.get().toString().length <4) {
"Too short"
} else {
"Good enough"
}
}

Kullanıcı paraloyı girmeye başladığından itibaren getPasswordQuality() fonksiyonu çalışmaya başlar ve parola seviyesine göre geriye string bir değer döner.

android:text="@{model.getPasswordQuality}"

TextView da bu kısım dinlenerek kullanıcıya anında parola hakkında bilgi verilir.

--

--

Fırat Uckan

Software Engineer @Trendyol & Software Development