Class binding yang dihasilkan

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.

Sampel

Codelab

Postingan blog