Class binding yang dihasilkan

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.