Android ViewBinding
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.
ViewBinding projenizde mevcut olan her layout için bir Binding sınıfı oluşturacaktır.
Ö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.
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.
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.
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.
Ö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çinActivityMainBinding.java
gibi) - İ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’dakotlin-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.