Library Data Binding menghasilkan class binding yang digunakan untuk mengakses variabel dan tampilan tata letak. Artikel ini menjelaskan cara membuat dan menyesuaikan class binding yang dihasilkan.
Class binding yang dihasilkan menautkan variabel tata letak dengan tampilan dalam
tata letak. Nama dan paket class binding dapat
disesuaikan. Semua class binding yang dihasilkan mewarisi atribut
dari
class ViewDataBinding
.
Class binding dibuat untuk setiap file tata letak. Secara default, nama class
didasarkan pada nama file tata letak, dengan mengonversinya menjadi Pascal case, dan
menambahkan akhiran Binding ke nama tersebut. Nama file tata letak di atas adalah
activity_main.xml
sehingga class terkait yang dihasilkannya adalah
ActivityMainBinding
. Class ini menampung semua binding dari properti
tata letak (misalnya variabel user
) ke tampilan tata letak dan mengetahui
cara menetapkan nilai untuk ekspresi binding.
Membuat objek binding
Objek binding dibuat segera setelah tata letak di-inflate untuk memastikan
hierarki tampilan tidak diubah sebelum objek terikat ke tampilan dengan
ekspresi dalam tata letak. Metode yang paling umum untuk mengikat objek ke
tata letak adalah dengan menggunakan metode statis di class binding. Anda dapat meng-inflate
hierarki tampilan dan mengikat objek ke sana menggunakan metode inflate()
di
class binding, seperti ditunjukkan dalam contoh berikut:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater) setContentView(binding.root) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.root); }
Terdapat versi alternatif dari metode inflate()
yang mengambil objek ViewGroup
selain objek LayoutInflater
, seperti ditunjukkan dalam contoh berikut:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
Jika diluaskan menggunakan mekanisme berbeda, tata letak dapat diikat secara terpisah, seperti berikut:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
Terkadang jenis binding tidak dapat diketahui sebelumnya. Dalam kasus semacam ini,
binding dapat dibuat menggunakan
class DataBindingUtil
,
seperti yang ditunjukkan dalam cuplikan kode berikut:
Kotlin
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Java
View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bind(viewRoot);
Jika Anda menggunakan item data binding di dalam adaptor Fragment
,
ListView
, atau RecyclerView
, Anda dapat memilih untuk menggunakan metode
inflate()
class binding atau
class DataBindingUtil
, seperti
yang ditunjukkan dalam contoh kode berikut:
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
Tampilan dengan ID
Library Data Binding membuat kolom yang tidak dapat diubah di class binding untuk setiap
tampilan yang memiliki ID dalam tata letak. Misalnya, Library Data Binding membuat
kolom firstName
dan lastName
jenis TextView
dari tata letak
berikut:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:id="@+id/firstName"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:id="@+id/lastName"/>
</LinearLayout>
</layout>
Library mengekstrak tampilan dengan menyertakan ID dari hierarki tampilan dalam
satu proses. Mekanisme ini dapat lebih cepat daripada memanggil metode findViewById()
untuk setiap tampilan dalam
tata letak.
ID tidak sepenting saat tanpa data binding, tetapi ada kalanya akses ke tampilan masih diperlukan dari kode.
Variabel
Library Data Binding menghasilkan metode pengakses untuk setiap variabel yang dideklarasikan
dalam tata letak. Misalnya, tata letak berikut menghasilkan metode penyetel dan
pengambil di class binding untuk variabel user
, image
, dan note
:
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
ViewStub
Tidak seperti tampilan normal, objek ViewStub
dimulai sebagai
tampilan yang tidak terlihat. Saat dibuat terlihat atau secara eksplisit diminta untuk
meng-inflate, objek ini mengganti dirinya sendiri dalam tata letak dengan meng-inflate tata letak lain.
Karena ViewStub
pada dasarnya menghilang dari hierarki tampilan, tampilan di
objek binding juga harus menghilang agar dapat diklaim melalui pembersihan sampah
memori. Karena tampilan bersifat final,
objek ViewStubProxy
menggantikan ViewStub
di class binding yang dihasilkan sehingga Anda
mendapatkan akses ke ViewStub
saat objek tersebut ada, juga akses ke hierarki tampilan
yang di-inflate saat ViewStub
telah di-inflate.
Setelah meng-inflate tata letak lainnya, binding harus dibuat untuk tata letak baru.
Oleh karena itu, ViewStubProxy
harus memproses ViewStub
OnInflateListener
dan membuat
binding jika diperlukan. Karena hanya boleh ada satu pemroses pada satu waktu,
ViewStubProxy
memungkinkan Anda menetapkan OnInflateListener
, yang dipanggil setelah
binding dibuat.
Binding Langsung
Saat sebuah variabel atau objek yang dapat diamati berubah, binding dijadwalkan untuk berubah
sebelum frame berikutnya. Namun, ada kalanya binding harus dijalankan
segera. Untuk menerapkan eksekusi, gunakan
metode
executePendingBindings()
.
Binding Lanjutan
Variabel Dinamis
Terkadang, class binding tertentu tidak dikenal. Misalnya, RecyclerView.Adapter
yang beroperasi terhadap tata letak
arbitrer tidak mengenal class binding tertentu. Objek ini tetap harus menetapkan
nilai binding selama panggilan ke metode onBindViewHolder()
.
Dalam contoh berikut, semua tata letak yang diikat oleh RecyclerView
memiliki
variabel item
. Objek BindingHolder
memiliki metode getBinding()
yang menampilkan
class dasar
ViewDataBinding
.
Kotlin
override fun onBindViewHolder(holder: BindingHolder, position: Int) { item: T = items.get(position) holder.binding.setVariable(BR.item, item); holder.binding.executePendingBindings(); }
Java
public void onBindViewHolder(BindingHolder holder, int position) { final T item = items.get(position); holder.getBinding().setVariable(BR.item, item); holder.getBinding().executePendingBindings(); }
Thread Latar Belakang
Anda dapat mengubah model data di thread latar belakang selama model data tersebut tidak berupa koleksi. Data binding melokalkan setiap variabel/kolom selama evaluasi untuk menghindari masalah konkurensi.
Nama class binding kustom
Secara default, class binding dihasilkan berdasarkan nama file tata letak,
yang dimulai dengan huruf besar, menghapus garis bawah ( _ ), menuliskan inisial kata berikutnya
dalam huruf besar, dan menambahkan akhiran Binding ke nama. Class ini ditempatkan dalam
paket databinding
di bagian paket modul. Misalnya, file tata letak
contact_item.xml
menghasilkan class ContactItemBinding
. Jika paket
modulnya adalah com.example.my.app
, class binding akan ditempatkan di
paket com.example.my.app.databinding
.
Class binding dapat diganti namanya atau ditempatkan di paket berbeda dengan menyesuaikan
atribut class
di elemen data
. Misalnya, tata letak berikut
menghasilkan class binding ContactItem
dalam paket databinding
di
modul saat ini:
<data class="ContactItem">
…
</data>
Anda dapat menghasilkan class binding di paket berbeda dengan mengawali nama class dengan titik. Contoh berikut menghasilkan class binding dalam paket modul:
<data class=".ContactItem">
…
</data>
Anda juga dapat menggunakan nama paket lengkap di tempat Anda ingin class binding
dibuat. Contoh berikut membuat class binding ContactItem
di
paket com.example
:
<data class="com.example.ContactItem">
…
</data>
Referensi lainnya
Untuk mempelajari data binding lebih lanjut, lihat referensi tambahan berikut.