Class binding yang dihasilkan

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.