Fırat Uckan
3 min readNov 30, 2020

Mvvm Yapısı Nedir ? Mvvm de DataBinding Kullanımı

Merhaba bu yazımda Mvvm yapısından ve Mvvm de DataBinding kullanımından bahsedeceğim. Bu yazının 2. serisinde ise DataBinding çeşitlerinden bahsetmeye çalışacağım.

Öncelikle Mvvm nedir diye başlayalım..

MVVM: 2005 yılında Microsoft tarafından ortaya çıkarılmış bir yazılım mimarisidir diyebiliriz.

https://cdn.journaldev.com/wp-content/uploads/2018/04/android-mvvm-pattern.png

Yukarıdaki resimde de anlaşıldığı gibi Mvvm üç temel yapıdan oluşmaktadır. Bunlar ;

Model

Data servislerimizi, veritabanı bağlantılarımızdan gelen verilerin yönetildiği yerdir.Gelen datayı ViewModel e gönderir.

View

Kullanıcı arayüzünü temsil eder gelen input değerleri ViewModel e gönderir.

ViewModel:

View ile Model arasında doğrudan bir bağlantı olmadığı için araya bu ilişkiyi kuracak bir katman gereklidir. ViewModel bu görevi üstlenir.

http://devnot.com/wp-content/uploads/2015/01/mvvm-pattern.gif

Faydaları:

  • Data servislerinin ve business yapısının birbirinden ayrıştırılmasını sağlar.
  • Okunabilir ve kolay geliştirilebilir bir ortam sunar.
  • Uygulamanın test edilebilirliğini artırır.
  • Data servis, business ve arayüz birbirinden ayrıştığı için bakımı kolaylaştırır.

Mvvm yapısını biraz kavradıktan sonra sıra geldi DataBinding kısmına .

DataBinding :

Veri bağlama anlamına gelir. Kullanıcı tarafından manuel müdahale olmadan otomatik olarak devreye girer. Verilerimiz ile arayüz arasındaki senkronizasyonu sağlar.

DataBindingin birden fazla kullanım yeri vardır. Şimdi bir örnek ile en basit yapısıyla anlatmaya çalışacağım.Bundan sonraki yazımda ise DataBinding in diğer kullanım alanlarından bahsedeceğim.

Öncelikle boş bir Android projesi oluşturalım.İlk yapmamız gereken build.gradle dosyasında dataBinding enabled etmek olacak.

dataBinding {
enabled = true
}

Gradle dosyasını sync ettikten sonra projemizin View kısmını düzenleyelim yani arayüz kısmı :

activity_main.xml

DataBinding kullanmak istiyorsak acitivity xml in <layout></layout> dizini altında toplamak gerekiyor. Örnekte oluşturduğumuz RelativeLayout bu dizin altında belirttik.

<data>

<variable
name="viewModel"
type="com.example.mvvm_databinding.MainViewModel"/>

</data>

<data> dizininde kullanacağımız ViewModel veya objeleri belirtiyoruz. Biz burada MainViewModel üzerinden data göndereceğiz.

android:text="@={viewModel.username}"
android:text="@={viewModel.password}"

Burada ise xml de bulunan username ve password edittextleri üzerinde yapılan veri girişini ViewModel de değişken olarak tanımlanan username ve password e atamalarını yaptık.

android:onClick="@{()->viewModel.login()}"

Buton a tıklandıktan sonra eventi yakalamak için onClick methoduna viewModel de bulunan login function a yönlendiriyoruz.

Xml imizi anlattığımıza göre artık ViewModel e göz atabiliriz.

gisMainViewModel.kt

Evet , viewmodelimizi yukarıdaki gibi düzenliyoruz. Burada görüldüğü gibi xml içerisinde <data> dizini altında username,password ve login function a erişiyoruz. View modelimizi tasarladıktan sonra sıra geldi son kısım olan Activity yazmaya.

MainActivity.kt
private lateinit var viewModel: MainViewModel

MainViewModelimizi erişmek için tanımlıyoruz.

lateinit var binding: ActivityMainBinding

Burası çok önemli bir detay bu dosyası biz oluşturmuyoruz.Xml ile Activity arasındaki bağlantıyı sağlayan kısım diyebiliriz. İsim xml isminden referans alıyor. Örnek olarak xml ismi : item_list.xml olsaydı bizim Binding dosyasının ismi : ItemListBinding olacaktı.

binding.viewModel=viewModel

Burada binding yani xml üzerinde bulunan <data> setinin içerisinde yer alan viewModel variable bizim oluşturduğumuz viewmodel oldugunu belirtiyoruz.

viewModel.message.observe(this, Observer { res ->
if (res != null) {
val message = res.format(this)
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
})

Bu kısım ise Viewmodel içerisinde message değişkeni live data olduğu için her hangi bir güncelleme sonrası Toast mesajı ile uyarı veriyoruz.

Uygulama çıktısı aşağıdaki gibidir. Kaynak kodlara aşağıdaki linkten ulaşabilirsiniz.

başarısız giriş denemesi
başarılı giriş denemesi