Library Data Binding menghasilkan class binding yang dapat Anda gunakan untuk mengakses untuk 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
pengikatannya. Semua class binding yang dihasilkan mewarisi dari
Class ViewDataBinding
.
Class binding dibuat untuk setiap file tata letak. Secara {i>default<i}, nama
adalah nama file tata letak yang dikonversi ke Pascal case dengan Binding
akhiran yang ditambahkan ke dalamnya. Jadi, misalnya, jika nama file tata letak
activity_main.xml
, class terkait yang dihasilkan adalah ActivityMainBinding
.
Class ini menyimpan semua binding dari properti tata letak ke elemen
dan mengetahui cara menetapkan nilai untuk ekspresi binding.
Membuat objek binding
Objek binding dibuat segera setelah tata letak di-inflate untuk membuat
memastikan hierarki tampilan tidak diubah sebelum diikat ke tampilan dengan
ekspresi di dalam tata letak. Metode yang paling umum untuk mengikat objek ke
adalah menggunakan metode statis pada class binding. Anda bisa meng-inflate
hierarki tampilan dan mengikat objek ke dalamnya menggunakan metode inflate()
seperti yang 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); }
Ada versi alternatif dari metode inflate()
yang menggunakan
ViewGroup
selain
LayoutInflater
, sebagai
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 yang berbeda, Anda dapat mengikatnya secara terpisah, sebagai berikut:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
Terkadang Anda tidak mengetahui jenis binding sebelumnya. Dalam kasus tersebut, 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 Anda menggunakan item data binding di dalam
Fragment
,
ListView
, atau
RecyclerView
adaptor, Anda dapat memilih untuk menggunakan
inflate()
dari class binding atau
DataBindingUtil
, sebagai
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
dengan jenis TextView
dari
berikut tata letaknya:
<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
{i>single pass<i}. Mekanisme ini bisa lebih cepat
daripada memanggil metode
findViewById()
untuk setiap tampilan dalam tata letak.
ID tidak sepenting tanpa data binding, tapi masih ada beberapa kasus di mana akses ke tampilan diperlukan dari kode.
Variabel
Library Data Binding menghasilkan metode pengakses untuk setiap variabel yang dideklarasikan
dalam tata letak. Misalnya, tata letak berikut menghasilkan 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. Ketika mereka terlihat atau
secara eksplisit dibesar-besarkan,
mereka 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 oleh pembersihan sampah memori.
Karena tampilan tersebut bersifat final,
Objek ViewStubProxy
menggantikan ViewStub
di class binding yang dihasilkan, memberi Anda
akses ke ViewStub
saat ada dan akses ke tampilan yang di-inflate
hierarki saat ViewStub
di-inflate.
Saat meng-inflate tata letak lain, binding harus dibuat untuk tata letak baru.
Oleh karena itu, ViewStubProxy
harus memproses ViewStub
OnInflateListener
dan menetapkan pengikatan jika diperlukan. Karena hanya boleh ada satu pemroses pada
waktu, ViewStubProxy
memungkinkan Anda menyetel OnInflateListener
, yang dipanggil
setelah menetapkan pengikatan.
Binding langsung
Saat sebuah variabel atau objek yang dapat diamati berubah, binding dijadwalkan untuk berubah
sebelum {i>frame<i} berikutnya. Namun, ada kalanya binding harus dijalankan
segera. Untuk memaksa eksekusi, gunakan
executePendingBindings()
.
Variabel dinamis
Terkadang, class binding tertentu tidak diketahui. Sebagai contoh,
RecyclerView.Adapter
yang beroperasi terhadap tata letak arbitrer tidak
mengetahui class binding tertentu. Ini
harus menetapkan nilai binding selama panggilan ke
onBindViewHolder()
.
Pada contoh berikut, semua tata letak yang diikat oleh RecyclerView
memiliki
Variabel item
. Objek BindingHolder
memiliki metode getBinding()
mengembalikan
ViewDataBinding
basis
.
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 pengumpulan data. {i>Data binding<i} melokalkan setiap variabel atau {i>field<i} selama evaluasi untuk menghindari masalah konkurensi.
Nama class binding kustom
Secara default, class binding dihasilkan berdasarkan nama file tata letak,
dimulai dengan huruf besar, menghapus garis bawah ( _ ), menggunakan huruf besar
huruf berikutnya, dan akhiran kata Binding. Misalnya, file tata letak
contact_item.xml
menghasilkan class ContactItemBinding
. Kelas ditempatkan
dalam paket databinding
di bawah paket modul. Misalnya, jika modul
adalah com.example.my.app
, maka class binding ditempatkan di
com.example.my.app.databinding
.
Class binding dapat diganti namanya atau ditempatkan di paket yang 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 berbeda dengan memberi awalan pada class dengan titik. Contoh berikut menghasilkan class binding di paket modul:
<data class=".ContactItem">
...
</data>
Anda juga dapat menggunakan nama paket lengkap di mana 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.
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Tata letak dan ekspresi binding
- Library Data Binding
- View binding