ViewBinding — findViewById’ye elveda…

Enes İğneci
MobvenLab TR
Published in
1 min readJan 5, 2021

Merhabalar, bu yazımda sizlere uygulamamda kullanmakta olduğum componentlere ulaşmak için kullandığım View.findViewById methodunu ve Kotlin Synthetic kullanımlarını View Binding ile değiştirme maceramı paylaşmaya çalışacağım…

Öncelikle neden böyle bir değişiklik yapmamız gerektiğine bakalım.

findViewById methodu için kullandığımız resource idleri uygulama genelinde kullanılan resource idleri olduğu için hatalı kullanımda null dönebilir; oysa ki ViewBinding’de her bir view için classlar oluşturulur ve doğru type ile oluşturulur. Bu da null-safe bir biçimde viewleri atamaya yardımcı olur.

Nasıl yapılır?

Öncelikle, application seviyesindeki build.gradle dosyamızda

apply plugin: 'kotlin-android-extensions'

ekleyerek kotlin-android-extensions’ı aktif ettikten sonra android scope’u altında

buildFeatures {
viewBinding true
}

ekleyerek projede ViewBinding kullanmak istediğimizi söylüyoruz.

Sonrasında uygulama içerisinde kullandığımız findViewById’ler ve Kotlin syntethic “kotlinx.android.synthetic” importlarını bulup siliyoruz :)

Kısaca, Activity’ler için

private lateinit var binding: MainActivityBinding

ile binding değişkenini tanımlıyoruz. Daha sonra onCreate’te

binding = MainActivityBinding.inflate(layoutInflater)
setContentView(binding.root)

şeklinde initialize edip setContentView methoduna binding.root’u veriyoruz.

Not: Eğer bir included layout kullanıyorsanız, (Fragment Navigation component kullanıyorsanız muhtemelen content_main.xml’i include ediyorsunuzdur.) bu durumda activity içerisinde bu view’ın bir elemanını kullanmak isterseniz

val toolbar = ContentMainBinding.bind(binding.root).toolbar

şeklinde content_main.xml için oluşturulmuş olan class’ı kullanabilirsiniz.

Fragment’lar için

private var _binding: MainFragmentBinding? = null
private val binding get() = _binding!!

ile ViewBinding nesnesini tanımladıktan sonra onCreateView’de

_binding = MainFragmentBinding.inflate(inflater, container, false)
val view = binding.root

şeklinde MainFragment için oluşturulmuş MainFragmentBinding class’ını kullanarak view’ı oluşturabiliriz.

Ardından onDestroyView’de

_binding = null

şeklinde kullanımımızı sonlandırabiliriz.

İlginize teşekkür ederim :)

--

--