Library Data Binding menghasilkan class binding yang dapat Anda gunakan untuk mengakses variabel dan tampilan tata letak. Dokumentasi ini menunjukkan cara membuat dan menyesuaikan class binding yang dihasilkan.
Class binding yang dihasilkan menautkan variabel tata letak dengan tampilan dalam
tata letak. Anda dapat menyesuaikan nama dan paket
binding. Semua class binding yang dihasilkan mewarisi dari
class ViewDataBinding
.
Class binding dibuat untuk setiap file tata letak. Secara default, nama
class adalah nama file tata letak yang dikonversi ke Pascal case dengan akhiran Binding
ditambahkan ke dalamnya. Jadi, misalnya, jika nama file tata letak adalah
activity_main.xml
, class terkait yang dihasilkan adalah ActivityMainBinding
.
Class ini menyimpan semua binding dari properti tata letak 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 pada class binding. Anda dapat meng-inflate
hierarki tampilan dan mengikat objek ke dalamnya 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 yang
ditunjukkan dalam contoh berikut:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
Jika tata letak di-inflate menggunakan mekanisme berbeda, Anda dapat mengikatnya secara terpisah, seperti berikut:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
Terkadang Anda tidak mengetahui jenis binding sebelumnya. Dalam kasus ini, Anda dapat
membuat binding 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 menggunakan item data binding di dalam adaptor
Fragment
,
ListView
, atau
RecyclerView
, Anda mungkin lebih memilih 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, termasuk ID, dari hierarki tampilan dalam
satu penerusan. Mekanisme ini dapat lebih cepat daripada memanggil metode
findViewById()
untuk setiap tampilan dalam tata letak.
ID tidak sepenting saat tanpa data binding, tetapi masih ada beberapa kasus yang memerlukan akses ke tampilan 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 di-inflate secara eksplisit,
elemen tersebut mengganti dirinya sendiri dalam tata letak dengan meng-inflate tata letak lain.
Karena ViewStub
menghilang dari hierarki tampilan, tampilan di
objek binding juga harus menghilang agar dapat diklaim melalui pembersihan sampah memori.
Karena tampilan bersifat final, objek ViewStubProxy
akan menggantikan ViewStub
di class binding yang dihasilkan, sehingga memberi Anda
akses ke ViewStub
saat objek itu ada dan akses ke hierarki tampilan
yang di-inflate saat ViewStub
di-inflate.
Saat meng-inflate tata letak lain, binding harus ditetapkan 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 membuat binding.
Binding langsung
Saat sebuah variabel atau objek yang dapat diamati berubah, binding dijadwalkan untuk berubah
sebelum frame berikutnya. Namun, ada kalanya binding harus segera
dieksekusi. Untuk memaksa eksekusi, gunakan
metode
executePendingBindings()
.
Variabel dinamis
Terkadang, class binding tertentu tidak diketahui. Misalnya, RecyclerView.Adapter
yang beroperasi terhadap tata letak arbitrer tidak mengetahui class binding tertentu. Aplikasi
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 tersebut bukan koleksi. Data binding melokalkan setiap variabel atau kolom selama evaluasi untuk menghindari masalah serentak.
Nama class binding kustom
Secara default, class binding dibuat berdasarkan nama file tata letak,
dimulai dengan huruf besar, menghapus garis bawah ( _ ), menuliskan huruf besar
untuk huruf berikutnya, dan menambahkan akhiran Binding ke nama. Misalnya, file tata letak
contact_item.xml
menghasilkan class ContactItemBinding
. Class ini ditempatkan
dalam paket databinding
di bawah paket modul. Misalnya, jika paket
modul 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
dari 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 yang 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
dalam
paket com.example
:
<data class="com.example.ContactItem">
...
</data>
Referensi lainnya
Untuk mempelajari data binding lebih lanjut, lihat referensi tambahan berikut.
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Tata letak dan ekspresi binding
- Library Data Binding
- View binding