Android X: View Binding

Merhaba bu yazıda Android Studio 3.6 versiyonuyla gelecek olan View Binding hakkında bahsedeceğim.

Android programlamada eskilerden beridir boilerplate olan findViewById ile view’lara referans alma işlemi gerçekleştirilmektedir. Fazla bişeymiş gibi gözükmüyor olabilir fakat view’lar çoğaldıkça yazmanız gereken kod giderek artıyor.

public class MainActivity extends Activity {
  private TextView description; 
  private Button signInButton; 
  private Button cancelButton; 

  // onCreate() 
  description = (TextView) findViewById(R.id.description); 
  signInButton = (Button) findViewById(R.id.signInButton); 
  cancelButton = (Button) findViewById(R.id.cancelButton); 
} 

Yazılımcılar arasında kolaylığı yakalamak için birçok kütüphane geliştirilmiştir. en çok bilineni ButterKnife kütüphanesidir. Aşağıdaki örnek kullanımını görebilirsiniz.

public class MainActivity extends Activity { 
	@BindView(R.id.description) TextView description; 
	@BindView(R.id. signInButton) Button signInButton; 
	@BindView(R.id. cancelButton) Button cancelButton; 

	// onCreate() 
	ButterKnife.bind(this); 
} 

Daha birçok alternatif var, mesela Kotlin Android Extensions kullanırken yazılan uygulamanın boyutu büyüdükçe arttıkça birçok bug olayı çıkmaya başladı, fakat en popüleri şuan ButterKnife idi fakat kütüphane geliştiricileri bu yeni özelliğin hayatımıza girecek olmasıyla şöyle bir uyarıda bulundular:

Attention: Development on this tool is winding down. Please consider switching to view binding in the coming months. “

Şuan View Binding özelliğini kullanmak isterseniz Android Studio 3.6 Canary 11+ yüklemeniz gerekecek. Aynı anda hem Android Studio hem de Canary versiyonunu kurup uygulama geliştirebilirsiniz.

Bu özelliği kullanabilmek için Android Gradle Plugin 3.6.0-alpha11 versiyonuna yükselttikten sonra build.gradle içerisinde view binding özelliğini aktif etmeniz gerekiyor. Ayrıca plugin sürümü Gradle versiyonu 5.6.1+ olmasını gerektirmektedir. gradle-wrapper.properties içerisinden sürümü kontrol edebilirsiniz.

android { 
    ... 
    viewBinding { 
        enabled = true 
    } 
} 

Kod içerisinde basitçe belirlenen arayüz XML dosyaları için binding class’lar oluşturulur ve arayüz elemanlarının referansı direkt olarak kod içerisinde alınabilir. Kotlin kodu içeren örneklerine buradan ulaşabilirsiniz.

View binding ile findViewById metodunun farklılıkları:

  • Null Safety: View binding ile direk view’lara referans alındığından null pointer exception gibi bi hata alma şansı yok. Üstelik oluşturulan binding class içerisinde view’a karşılık gelen değişkenlerde @Nullable annotation’ı var.
  • Type safety: XML içerisindeki view’ara direk referans aldığından cast exception gibi bir risk oluşmaz.

Bu ikisiyle zaten compile time’da hata alma olasılığı baya bi düşecek gibi gözüküyor.

  • Oryantasyon değişikliği : Landscape-portrait oryantasyonları için birden fazla XML dosyası olabiliyor. Bazen landscape içerisinde olan bir arayüz bileşeni portrait içinde olmayabiliyor bu sebeple birden fazla değişken kullanmamız gerekebiliyor. Hatta bazı yerlerde null pointer exception atabiliyor. Bu sorun da ortadan kalkacak.
  • Hız: ButterKnife veya Data Binding gibi işlemciyi yoran annotation’lar yok. Build hızı artacak.

Data binding yazımı buradan okuyabilirsiniz.