View Binding Kullanımı

By | 18 Temmuz 2021

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.

  1. Eskisi gibi eklenti kullanarak.
  2. Her bir componenti tek tek tanımlayarak
  3. 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…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir