Projelerimizde xml kısmında kullandığımız componentlere id verip bu id’lere göre kod kısmından erişip üzerinde işlemler yapıyorduk. Kotlinde bunun için arka planda bazı işlemleri yapan bir eklenti kullanılıyordu ama artık bu eklentinin kullanılması istenmiyor. Bu sebepten componentlere doğrudan erişemiyoruz. Google böyle bir değişikliğe gidince birçok kişi aşağıdaki sorunla karşılaşmıştır.
Görüldüğü gibi TextView’a erişemiyoruz. Bu dersimizde bunu çözmenin 3 yolunu öğreneceğiz.
- Eskisi gibi eklenti kullanarak.
- Her bir componenti tek tek tanımlayarak
- ViewBinding nimetinden faydalanarak 😊
Yöntem – 1

Resimde görüldüğü gibi gradle dosyasına gidip
id 'kotlin-android-extensions'
satırını ekledikten sonra Sync Now diyerek bu sorunu halletmiş olursunuz.
NOT: Bu yöntemin kullanılması artık tercih edilmiyor. Profesyonel bir uygulama geliştirecekseniz veya çalıştığınız iş yeri için bu yöntemin kullanılmasının uygun olmadığını belirtmek isterim. Çünkü Google bu yöntemin artık kullanılmasını istemiyor.
Yöntem – 2
Burada bahsedeceğim yöntemin kullanılması yönünde hiçbir sıkıntısı yoktur. Tek sorun yapılacak işlemlerin bizim açımızdan biraz uzamasıdır.

TextView, EditText veya ProgressBar gibi herhangi bir componenti en üstte oluşturuyoruz ki scope alanının geniş olmasını sağlıyoruz. Her yerden erişebilinecek. Daha sonra onCreate() içerisinde oluşturduğumuz componenti findViewById ile xml içerisinde verdiğimiz id’e göre tanımlıyoruz ve artık kullanıma hazır hale getiriyoruz.
Eğer fragment veya başka bir şeyin içerisindeyseniz yapılan işlemlerde çok ufak bir değişiklik yapılacak. Aşağıda görüldüğü gibi metot içerisinde bize verilen veya bizim oluşturduğumuz bir view ile erişme imkanı sağlıyoruz.

NOT: Bu yöntemin kullanılmasında bir sıkıntı olmadığının ama işlemlerinin biraz uzun olduğunu söylemiştim. Bu sebepten kullanıp kullanmamak size kalmış.
Yöntem – 3
Şimdi 3. Yöntem olan ve dersin asıl amacı olan kullanılması önerilen yöntemin nasıl kullanıldığından bahsetmeye çalışacağım.
1. Ve 2. Adımda yaptıklarımızın karışımı olan bu yöntemde tek seferlik bir işlem yaptıktan sonra artık kullanımı rahat olacaktır. Nasıl yapıldığını adım adım inceleyelim.
Adım-1;
Gradle dosyasının içerisine girip android{} içerisinde en alt kısma aşağıdaki kod satırını ekleyip Sync Now diyoruz.
buildFeatures {
viewBinding = true
}

Adım-2;
Bu adımda yapacaklarınızı öncelikle örnek bir görsel üzerinden göstereyim ve ardından anlatıma devam edeyim.

Sınıf içerisinde öncelikle en üstte bir binding oluşturduk aşağıdaki gibi
private lateinit var binding: ActivityMainBinding
Burada dikkat edilmesi gereken kısım şudur. Biz Gradle dosyası içerisinde bir takım işlemler yaptığımızdan dolayı bizim için bazı sınıflar oluşturuldu. Örneğin activity_main.xml dosyası için ActivityMainBinding isminde bir dosya oluşturuldu. Tasarım dosyanızın ismi neyse sonuna Binding eklenen bir sınıf…
Daha sonra aşağıdaki yapıyı oluşturuyoruz.
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.textview.text = "Test"
Artık binding anahtar kelimemiz ile tasarım dosyamız içerisindeki id’i bulunan tüm componentlere erişebiliriz.
Şimdi bu yöntemi fragment içerisinde nasıl kullanabiliriz onu da görelim ve bu dersimize son verelim.

Daha önceden fragment içerisinde tasarım dosyamızı bir view‘a eşitleyip kullanıyorduk. Burada ise _binding değişkenine eşitleyip .root ile tekrardan view‘a eşitledik arada pek bir fark olmasa da _binding‘i eşitlediğimiz yerde de çok ufak bir parametre farkı yer almakta. İnceleyerek nasıl yapıldığını çok rahat bir şekilde anlayabilirsiniz.
Google’ın dökümanlarına baktığımızda bize şöyle bir bilgi vermekte.
This property is only valid between onCreateView and onDestroyView.
developer.android.com
Bu özelliğin yalnızca onCreateView ve onDestroyView arasında geçerli olduğunu söylemesinden dolayı en sonda destroy içerisinde tekrardan null ettik.
Bir sonraki dersimizde görüşmek üzere…
bu işlemleri her proje için ayrı ayrı yapmakmı lazım yoksa tek seferde yapılınca her projede geçerli olurmu ?
Selam Furkan, her proje için bir kere yapmak lazım
Neden böyle bir gereksinim duydular? Kotline yeni başladım hiçbir eğitimde böyle bir kullanım görmedim. Eğitimler eski olunca yapılan işlemlerde hata çıkartıyor. Günlerdir uğraşıyordum teşekkür ederim
Selam Burhan, öncelikle rica ederim faydası olduysa memnun oldum.
Neden böyle bir gereksinim duydular diye sormuşsun. Bunun cevabını büyük projelerde çalıştığın zaman kendin de anlayacaksın ama yine de anlatabildiğim kadarıyla anlatayım.
50-100 tane ekranı olan bir uygulama düşün ve bu ekranlarda kullandığın buton, textview vb componentlerin id’leri illaki farklı bir ekrandaki component’in di ile aynı olacaktır. Bu durumda id ile component’e erişmek istediğinde yanlış id’e erişmen durumunda crash’lar yani çökmeler meydana gelecektir. Ama ViewBinding’de bu gibi sorunları yaşamayacaksın çünkü bir layout dosyası içerisinde geliştirme yaparken zaten aynı id’e sahip birden fazla component’i tek dosyada bulundurmana izin vermemekte.
Hangi ekranda çalışıyorsan o ekrana ait binding ile id’lere eriştiğinden başka bir yerdeki aynı id’e istesen de erişemezsin ve uygulamanı daha güvenilir bir hale getirmiş olursun. Bu benim gördüğüm en önemli noktaydı bunun dışında farklı sebeplerde var tabi. Farklı bir durum için daha örnek vereyim.
Örneğin herhangi bir ekranda textView. yazdın ama bu id’li birden fazla component uygulama içerisinde yer alabilir. Bu ekranda hangisini kullandığını ayırt etmen bi tık zorlaşacak ama viewBindingde binding.textView. yazdığında zaten bir tane olduğu için doğru componente eriştim mi acaba gibi sorularından kaçınmış olursun.
Bu arada compoenentlere yani view’lara erişmenin birçok(findViewById, ButterKnife, viewBinding, dataBinding ve senin daha önce kullanmış olduğun eski yöntem) yolu bulunmakta. Bunlardan en çok kullanılanı viewbinding ve databinding bunlarla ilgili araştırmalar yapıp kendini geliştirmeni tavsiye ederim.