View Binding yang sudah lama dinanti di Android

Beberapa hari yang lalu, Google merilis Android Studio 3.6 Canary 11, inovasi utama di mana adalah View Binding, yang dijelaskan kembali pada bulan Mei di Google I / O 2019.



View Binding adalah alat yang membuatnya lebih mudah untuk menulis kode untuk berinteraksi dengan tampilan. Ketika Anda mengaktifkan View Binding dalam modul tertentu, itu menghasilkan kelas yang mengikat untuk setiap file tata letak dalam modul. Objek kelas penjilidan yang dihasilkan berisi tautan ke semua tampilan dari file markup yang ditentukan android:id .


Cara mengaktifkan


Untuk mengaktifkan View Binding di modul, Anda perlu menambahkan elemen ke file build.gradle :


 android { ... viewBinding { enabled = true } } 

Anda juga dapat menentukan bahwa Anda tidak perlu membuat kelas yang mengikat untuk file markup tertentu. Untuk melakukan ini, Anda perlu menentukan atribut tools:viewBindingIgnore="true" di tampilan root dalam file markup yang diinginkan.


Bagaimana cara menggunakan


Setiap kelas penjilidan yang dihasilkan berisi tautan ke tampilan akar markup ( root ) dan tautan ke semua tampilan yang memiliki id. Nama kelas yang dihasilkan dibentuk sebagai "nama file markup" diterjemahkan ke dalam case unta + "Binding".


Misalnya, untuk file markup result_profile.xml :


 <LinearLayout ... > <TextView android:id="@+id/name" /> <ImageView android:cropToPadding="true" /> <Button android:id="@+id/button" android:background="@drawable/rounded_button" /> </LinearLayout> 

Kelas ResultProfileBinding akan dihasilkan, berisi 2 bidang: TextView name dan Button button . Untuk ImageView tidak ada yang akan dihasilkan, karena tidak memiliki id . Juga di kelas ResultProfileBinding akan ada metode getRoot() yang mengembalikan root LinearLayout .


Untuk membuat objek class ResultProfileBinding , Anda perlu memanggil metode statis inflate() . Setelah itu, Anda dapat menggunakan tampilan root sebagai tampilan content view di Activity :


 private lateinit var binding: ResultProfileBinding @Override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) setContentView(binding.root) } 

Penjilidan selanjutnya dapat digunakan untuk mendapatkan tampilan:


 binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() } 

Perbedaan dari pendekatan lain


Keuntungan utama View Binding adalah keamanan Null dan keselamatan Tipe.


Pada saat yang sama, jika beberapa tampilan tersedia dalam satu konfigurasi markup, tetapi tidak di yang lain ( layout-land , misalnya), maka bidang @Nullable akan dihasilkan untuk itu di kelas yang mengikat.


Juga, jika dalam konfigurasi markup yang berbeda ada tampilan dengan id yang sama, tetapi tipe yang berbeda, bidang dengan tipe android.view.View akan dihasilkan untuk mereka.
(Setidaknya dalam versi 3.6 dari Canary 11)


Secara umum, akan lebih mudah jika bidang yang dihasilkan memiliki jenis spesifik yang paling mungkin. Misalnya, untuk Button dalam satu konfigurasi dan TextView di yang lain, bidang tipe TextView dihasilkan ( public class Button extends TextView ).


Saat menggunakan View Binding, semua inkonsistensi antara markup dan kode akan terdeteksi pada tahap kompilasi, yang akan menghindari kesalahan yang tidak perlu selama operasi aplikasi.


Penggunaan di RecyclerView.ViewHolder


Tidak ada yang mencegah menggunakan View Binding saat membuat view untuk RecyclerView.ViewHolder :


 class PersonViewHolder(private val itemPersonBinding: ItemPersonBinding) : RecyclerView.ViewHolder(itemPersonBinding.root) { fun bind(person: Person) { itemPersonBinding.name.text = person.name } } 

Namun, untuk membuat ViewHolder seperti ViewHolder harus menulis sedikit boilerplate:


 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder { val layoutInflater = LayoutInflater.from(parent.context) val itemPersonBinding = ItemPersonBinding.inflate(layoutInflater, parent, false) return PersonViewHolder(itemPersonBinding) } 

Akan lebih mudah jika, ketika bekerja dengan RecyclerView.ViewHolder metode inflate(...) tidak akan memiliki parameter layoutInflater , tetapi akan menerimanya dari orang parent lulus.


Di sini juga perlu disebutkan bahwa ketika menggunakan View Binding, view dicari melalui findViewById() hanya sekali ketika metode findViewById() inflate() . Ini memberikan keunggulan dibandingkan kotlin-android-extensions , di mana view caching secara default hanya berfungsi di Activity dan Fragment , dan RecyclerView.ViewHolder memerlukan konfigurasi tambahan .


Secara umum, View Binding adalah hal yang sangat nyaman yang mudah digunakan pada proyek yang ada. Creator Butter Knife sudah merekomendasikan untuk beralih ke View Binding.


Sangat disayangkan instrumen seperti itu tidak muncul beberapa tahun yang lalu.

Source: https://habr.com/ru/post/id467295/


All Articles