Lihat binding Bagian dari Android Jetpack.
View binding adalah fitur yang memudahkan penulisan kode yang berinteraksi dengan penayangan. Setelah diaktifkan dalam modul, view binding akan menghasilkan binding untuk setiap file tata letak XML yang ada dalam modul tersebut. Instance binding berisi referensi langsung ke semua tampilan yang memiliki ID di tata letak yang sesuai.
Pada umumnya, view binding menggantikan findViewById
.
Penyiapan
View binding diaktifkan per modul. Untuk mengaktifkan view binding di
tetapkan opsi build viewBinding
ke true
di level modul
build.gradle
, seperti yang ditunjukkan dalam contoh berikut:
Groovy
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
Jika Anda ingin mengabaikan file tata letak saat membuat class binding, tambahkan
atribut tools:viewBindingIgnore="true"
ke tampilan root tata letak tersebut
file:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
Penggunaan
Jika view binding diaktifkan untuk sebuah modul, class binding akan dibuat untuk setiap File tata letak XML yang terdapat di modul. Setiap class binding berisi referensi ke tampilan root dan semua tampilan yang memiliki ID. Nama class binding dihasilkan dengan mengonversi nama file XML menjadi Pascal case dan menambahkan kata "Binding" hingga akhir.
Misalnya, pertimbangkan file tata letak bernama result_profile.xml
yang berisi
hal berikut:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
Class binding yang dihasilkan disebut ResultProfileBinding
. Class ini memiliki dua
kolom: TextView
yang disebut name
dan Button
yang disebut button
. Tujuan
ImageView
dalam tata letak tidak memiliki ID, sehingga tidak ada referensi ke ID tersebut dalam
class binding.
Setiap class binding juga mencakup metode getRoot()
, yang menyediakan
referensi untuk tampilan root file tata letak terkait. Dalam contoh ini,
Metode getRoot()
di class ResultProfileBinding
akan menampilkan
Tampilan root LinearLayout
.
Bagian berikut menunjukkan penggunaan class binding yang dihasilkan dalam aktivitas dan fragmen Anda.
Menggunakan view binding dalam aktivitas
Untuk menyiapkan instance class binding agar dapat digunakan dengan aktivitas, lakukan metode
langkah-langkah berikut dalam
Metode onCreate()
:
- Panggil metode
inflate()
statis yang disertakan dalam class binding yang dihasilkan. Tindakan ini membuat instance dari class binding yang akan digunakan aktivitas. - Dapatkan referensi ke tampilan root dengan memanggil metode
getRoot()
atau menggunakan properti Kotlin sintaksis. - Teruskan tampilan root ke
setContentView()
untuk menjadikannya tampilan aktif di layar.
Langkah-langkah ini ditampilkan dalam contoh berikut.
Kotlin
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
Java
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
Sekarang, Anda dapat menggunakan instance class binding untuk merujuk ke tampilan mana pun:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Menggunakan view binding di fragmen
Untuk menyiapkan instance class binding agar dapat digunakan dengan fragmen, lakukan metode
langkah-langkah berikut dalam
onCreateView()
berikut:
- Panggil metode
inflate()
statis yang disertakan dalam class binding yang dihasilkan. Tindakan ini membuat instance class binding yang akan digunakan fragmen. - Dapatkan referensi ke tampilan root dengan memanggil metode
getRoot()
atau menggunakan properti Kotlin sintaksis. - Menampilkan tampilan root dari metode
onCreateView()
untuk membuatnya menjadi {i>active view<i} di layar.
Kotlin
private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
Java
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
Sekarang, Anda dapat menggunakan instance class binding untuk merujuk ke tampilan mana pun:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
Memberikan petunjuk untuk berbagai konfigurasi
Saat Anda mendeklarasikan tampilan di beberapa konfigurasi, terkadang hal ini membuat masuk akal untuk menggunakan jenis tampilan yang berbeda tergantung pada tata letak tertentu. Cuplikan kode berikut menunjukkan contohnya:
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
Dalam hal ini, Anda mungkin ingin class yang dihasilkan menampilkan kolom userBio
dari jenis TextView
, karena TextView
adalah class dasar umum. Karena
batasan teknis, generator kode {i>view binding<i}
tidak dapat menentukan hal ini dan
akan menghasilkan kolom View
. Anda perlu mentransmisikan kolom nanti dengan
binding.userBio as TextView
.
Untuk mengatasi keterbatasan ini, view binding mendukung tools:viewBindingType
, sehingga Anda dapat memberi tahu compiler jenis apa yang akan digunakan dalam kode yang dihasilkan.
Pada contoh sebelumnya, Anda dapat menggunakan atribut ini untuk membuat compiler
buat kolom sebagai TextView
:
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
Dalam contoh lain, misalkan Anda memiliki dua tata letak, salah satunya berisi
BottomNavigationView
dan lainnya yang berisi NavigationRailView
. Keduanya
class memperluas NavigationBarView
, yang berisi sebagian besar implementasi
spesifikasi
pendukung. Jika kode Anda tidak perlu tahu persis di subclass mana yang ada
tata letak saat ini, Anda dapat menggunakan tools:viewBindingType
untuk menyetel tata letak
ketik ke NavigationBarView
di kedua tata letak:
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
View binding tidak dapat memvalidasi nilai atribut ini saat membuat kode. Kepada menghindari error waktu kompilasi dan runtime, nilai harus memenuhi persyaratan berikut kondisi:
- Nilai harus berupa class yang diwarisi dari
android.view.View
. Nilai harus berupa superclass dari tag tempat nilai tersebut ditempatkan. Misalnya, nilai berikut tidak berfungsi:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
Jenis akhir harus di-resolve secara konsisten di semua konfigurasi.
Perbedaannya dengan findViewById
View binding memiliki keunggulan penting dibandingkan findViewById
:
- Keamanan null: karena view binding menghasilkan referensi langsung ke tampilan,
tidak ada risiko pengecualian pointer null karena ID tampilan tidak valid.
Selain itu, jika tampilan hanya ada di beberapa konfigurasi elemen
tata letak, kolom yang berisi referensinya di class binding akan ditandai
dengan
@Nullable
. - Keamanan jenis: kolom di setiap class binding memiliki jenis yang cocok dengan yang merujuknya dalam file XML. Ini berarti tidak ada risiko class pengecualian cast.
Perbedaan ini berarti ketidaksesuaian antara tata letak dan kode Anda mengakibatkan build Anda gagal pada waktu kompilasi, bukan pada runtime.
Perbandingannya dengan data binding
View binding dan data binding sama-sama menghasilkan class binding yang dapat Anda gunakan untuk mereferensikan tampilan secara langsung. Namun, lihat binding dimaksudkan untuk menangani kasus penggunaan yang lebih sederhana dan memberikan keunggulan dibandingkan data binding:
- Kompilasi yang lebih cepat: view binding tidak memerlukan pemrosesan anotasi, jadi waktu kompilasi menjadi lebih cepat.
- Kemudahan penggunaan: view binding tidak memerlukan tata letak XML yang diberi tag khusus sehingga lebih cepat diterapkan di aplikasi Anda. Setelah Anda mengaktifkan view binding di modul, itu berlaku untuk semua tata letak modul secara otomatis.
Di sisi lain, view binding memiliki batasan berikut dibandingkan dengan data mengikat:
- View binding tidak mendukung variabel tata letak atau tata letak ekspresi, sehingga tidak dapat digunakan untuk mendeklarasikan konten UI dinamis langsung dari file tata letak XML.
- View binding tidak mendukung data dua arah binding.
Karena pertimbangan ini, dalam beberapa kasus, sebaiknya gunakan kedua tampilan binding dan data binding di sebuah proyek. Anda dapat menggunakan data binding dalam tata letak yang memerlukan fitur lanjutan dan menggunakan view binding di tata letak yang tidak.
Referensi lainnya
Untuk mempelajari view binding lebih lanjut, lihat referensi tambahan berikut:
Contoh
Blog
Video
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Melakukan migrasi dari sintetis Kotlin ke view binding Jetpack
- Tata letak dan ekspresi binding
- Arsitektur Aplikasi: Lapisan UI - Memulai - Android Developers