Android ViewBinding

OKAN AYDIN
GDGIstanbul
Published in
4 min readDec 13, 2020

--

Kotlin’in yeni yayınladığı versiyon(Kotlin 1.4.20-M2) ile Android geliştiriciler olarak çoğumuzun kullandığı kotlin-android-extensions eklentisi kullanımdan kaldırıldı. Bununla beraber içerisinde barındırdığı kotlin synthetic de hayatımızdan çıkıyor. Bugün sizlere kotlin synthetic’e alternatif olarak neler kullanabileceğimizi ve mevcut projemiz ile ViewBinding’i nasıl kullanabileceğimizi anlatacağım.

1- findViewById

2- ViewBinding nedir ?

3- ViewBinding vs DataBinding

4- ViewBinding’i nasıl kullanabiliriz ?

1- findViewById

Oluşturmuş olduğunuz yeni bir android projesinde kotlin synthetic’i göremeyeceksiniz. Dolayısıyla findViewById’yi kullanarak ulaşmak istediğiniz öğeye erişebilirsiniz ve onun üzerinden işlem yapabilirsiniz. Fakat birden fazla aynı id’ye sahip buton ya da text’iniz varsa istediğiniz öğenin id’sine erişirken hata yapma olasılığınız yüksek olacaktır.

ViewBinding

ViewBinding’i sadece build.gradle dosyanızda aktif hale getirdiğiniz zaman dileğiniz gibi kullanabilirsiniz.

build.gradle

ViewBinding projenizde mevcut olan her layout için bir Binding sınıfı oluşturacaktır.

reference: Joe Birch

Örneğin activity_main.xml adında bir layout’unuz varsa ViewBinding otomatik olarak sizin için ActivityMainBinding.java sınıfı oluşturacaktır. Mevcut layout isminin sonuna Binding ekleyerek bir sınıf oluşturur. Bu layout içerisinde bulunan TextView, ImageView, ListView gibi tüm öğelerinize bu sınıf sayesinde ulaşabilirsiniz.

kopyalamak için tıklayınız.

Buradaki örnekte activity_main.xml ‘de bulunan bir TextView ’e erişirken, ViewBinding’in oluşturduğu ActivityMainBinding ‘i tanımlayarak erişebilirsiniz. Bir layout’u tanımlamak için onCreate() methodu içerisinde setContentView() için R.layout.activity_main yerine o layout için oluşturulan binding sınıfının root’unu tanımlıyoruz. Şu an sadece ActivityMainBinding ’i tanımladığımız için başka bir layout’un öğesine erişemeyiz. Bu sayede yanlış id kullanımının önüne geçilmiş oluyor.

ViewBinding bizim her layoutumuz için bir sınıf oluşturacak dedik. Peki ya herhangi bir layout için bu sınıfın oluşturulmasını istemezsek ?

İstediğiniz bir layout dosyanızı ignore ettiğinizde ViewBinding bunun için bir binding sınıfı oluşturmaz.

ViewBinding vs DataBinding

DataBinding de ViewBinding gibi Binding sınıfları oluşturuyor fakat;

  • ViewBinding annotation processing işlemi gerektirmez bu sayade derleme esnasında DataBinding’e göre daha hızlıdır.
  • DataBinding’i kullanmak istediğiniz yer layout için <layout> tagleri oluşturmalısınız fakat ViewBinding otomatik olarak her layout için binding sınıfları oluşturur ve kullanmak istemediğiniz layoutları ignore edersiniz. Bu yüzden ViewBinding’in kullanımı daha kolay diyebiliriz.
  • ViewBinding’de layout içerisinde layout değişkenleri tanımlayamazsınız ve layout içerisindeki öğelere doğrudan verinizi setleyemezsiniz. DataBinding ise bunu sağlar.

Dolayısıyla sunduğu şeyler farklı olduğu için bunlardan birini ya da ikisini birden kullanabilmek mümkündür.

Parcelize

Bir başka ufak değişiklik; ViewBinding konusu değil ama kotlin-android-extensions eklentisini kaldırdığınızda projenizde Parcelize olarak tanımladığınız data sınıflarını kullanabilmek için kotlin-parcelize eklentisini kullanmanız gerekiyor. import’larınız aşağıdaki gibi olmalıdır.

Öncesi :import kotlinx.android.parcel.Parcelize

Sonrası: import kotlinx.parcelize.Parcelize

4- ViewBinding’i nasıl kullanabiliriz?

Aslında bu kısma kadar ViewBinding’i basitçe kullanmayı gördük. Gelin birlikte mevcut bir projede nasıl kullanabileceğimize göz atalım.

  • BaseActivity ile kullanımı
  • İç içe viewler|include ile kullanımı
  • RecyclerView Adapter ile kullanımı

BaseActivity ile kullanımı

Projenizdeki BaseActivity’e parametre olarak ViewBinding tanımlayın ve bu sınıfı kullanan her sınıfta ona bir ViewBinding atayın.

kopyalamak için tıklayınız.

Bu örnekte MainActivity sınıfımız BaseActivity’den extend ediliyor ve Base’de tanımlamış olduğumuz getViewBinding() fonksiyonunu burada override edip MainActivityBinding’i atıyoruz.BaseActivity ’de tanımlanan binding’i kullarak ActivityMainBinding içerisindeki tüm öğelere erişelebilir durumdayız.

kopyalamak için tıklayınız.

Aynı method içerisinde birden fazla öğeye erişirken de with() fonksiyonunu kullanabiliriz.

İç içe layoutlar

Bir Activity ya da Fragment’ınıza birden fazla layoutun bağlı olduğunu varsayalım. Peki bu durumda ViewBinding’i nasıl kullanabiliriz?

1. Yöntem

Ana layoutunuza include ile eklediğiniz layout için bir id verip onun içersinde bulunan tüm öğelere erişebilirsiniz.

2. Yöntem

Zaten ViewBinding oluşturduğunuz item_user_photo.xml layout’u için binding sınıfı oluşturmuştu. Dolayısıyla ItemUserPhotoBinding sınıfını da aynı activity içerisinde tanımlayıp kullanabilirsiniz.

RecyclerView Adapter ile kullanımı

Yine aynı yöntemle bir ViewHolder’da parametre olarak View vermek yerine oluşturulan ViewBinding sınıfını tanımlayabilirsiniz.

Adapter’ın içerisinde yer alan onCreateViewHolder() için R.layout.xxx yerine oluşturulan binding sınıfını tanımlıyoruz.

onCreateViewHolder()

Özet

  • build.gradle dosyasından viewBinding’i aktif hale getirin.
  • ViewBinding tüm layout dosyalarımız için Binding sınıfları oluşturuyor.(activity_main.xml için ActivityMainBinding.javagibi)
  • İstediğiniz her hangi bir layout dosyanızı ignore edebilirsiniz. Bu sayade o layout için Binding sınıfı oluşturulmuyor.
  • ViewBinding ve DataBinding birbirlerine çok benzer yapıda da olsa aynı şeyler değildir.
  • Parcelize olarak tanımladığınız sınıflar için build.gradle’da kotlin-android-extensions yerinekotlin-parcelize kullanmalısınız.

Olabildiğince farklı case’lere değinmeye çalıştığım yazı burada sona eriyor. Eksik/hatalı ya da şu kısım şu şekilde olsa daha iyi olurdu diyeceğiniz şeyleri lütfen paylaşın, tartışalım.

--

--