View Binding adalah sebuah fitur yang memungkinkan kita untuk binding sebuah properti ke elemen view. Library ini secara otomatis akan memberi akses langsung ke semua view yang ada di dalam XML. Dengan demikian kita tidak perlu secara eksplisit melakukan binding ke elemen view menggunakan findViewByID() atau library lainnya.
Cara Mengaktifkan View Binding
Secara default View Binding tidak otomatis aktif. Guna mengaktifkannya, Anda perlu menambahkan kode berikut pada build.gradle pada level module yang akan menggunakan View Binding.
android { … buildFeatures { viewBinding true } } |
Setelah project disinkronisasikan, ia akan otomatis membuat kelas yang menampung semua id yang di dalam layout XML. Sebagai contoh Anda memiliki sebuah layout bernama activity_main.xml dengan isi sebagai berikut:
<LinearLayout …> <TextView android:id=”@+id/tv_welcome“ … /> </LinearLayout> |
Maka akan otomatis ter-generate class dengan nama ActivityMainBinding (PascalCase dari activity_main) pada app\build\generated\data_binding_base_class_source_out\debug\out\com\dicoding\[nama_aplikasi]\databinding dengan isi seperti berikut:
public final class ActivityMainBinding implements ViewBinding { @NonNull private final LinearLayout rootView; @NonNull public final TextView tvWelcome; … } |
Perhatikan bahwa setiap id yang ada di dalam layout tersebut akan dibuat variabelnya secara otomatis dengan format lowerPascalCase, seperti tv_welcome menjadi tvWelcome. Selain itu untuk layout dasarnya terdapat variabel rootView yang bisa Anda gunakan dengan menggunakan method getRoot().
Jika Anda ingin sebuah layout tidak di-generate class View Binding-nya, Anda harus menambahkan property berikut pada parent layout-nya.
<LinearLayout … tools:viewBindingIgnore=”true” … </LinearLayout> |
Cara Menggunakan View Binding
Untuk menggunakan View Binding Anda perlu membuat object View Binding yang meng-inflate Activity yang digunakan dan ganti parameter pada setContentView dengan root dari View Binding seperti berikut:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) } } |
Sekarang kamu bisa langsung menggunakan id tv_welcome yang di dalam activity_main.xml seperti berikut:
binding.tvWelcome.text = “Hello Dicoding” |
Dengan ini kamu tidak perlu lagi menggunakan findViewById yang biasanya menyebabkan boilerplate. Selain itu View Binding juga lebih aman karena ia hanya memberikan id yang sesuai dengan layout yang diperlukan saja, tidak seperti findViewById yang bisa mengakses id di semua layout yang menyebabkan null. Selain itu dengan View Binding tipe komponen yang diberikan sudah sesuai, tidak seperti findViewById yang bisa menimbulkan eror karena salah mendefinisikan tipe komponen.