View Binding

View binding adalah fitur yang memudahkan Anda menulis kode yang berinteraksi dengan tampilan. Setelah diaktifkan dalam sebuah modul, view binding akan menghasilkan class binding untuk setiap file tata letak XML yang ada dalam modul tersebut. Instance class binding berisi referensi langsung ke semua tampilan yang memiliki ID di tata letak yang terkait.

Pada umumnya, view binding menggantikan findViewById.

Petunjuk penyiapan

View binding diaktifkan di level modul. Untuk mengaktifkan view binding dalam modul, tambahkan elemen viewBinding ke file build.gradle-nya, seperti yang ditunjukkan pada contoh berikut:

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

Jika Anda ingin mengabaikan file tata letak saat membuat class binding, tambahkan atribut tools:viewBindingIgnore="true" ke tampilan root file tata letak tersebut:

<LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>
    

Penggunaan

Jika view binding diaktifkan untuk sebuah modul, sebuah class binding akan dihasilkan untuk setiap file tata letak XML yang berada di dalam modul. Setiap class binding berisi referensi ke tampilan root dan semua tampilan yang memiliki ID. Nama class binding dihasilkan dengan mengonversi nama file XML menjadi camel case dan menambahkan kata "Binding" ke bagian akhirnya.

Misalnya, pada file tata letak dengan nama result_profile.xml:

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

Class binding yang dihasilkan disebut ResultProfileBinding. Class ini memiliki dua kolom: TextView yang disebut name dan Button yang disebut button. ImageView dalam file tata letak di atas tidak memiliki ID, sehingga tidak ada referensi class tersebut dalam class binding ini.

Setiap class binding juga mencakup metode getRoot(), yang menyediakan referensi langsung untuk tampilan root file tata letak yang terkait. Dalam contoh ini, metode getRoot() dalam class ResultProfileBinding akan menampilkan tampilan root LinearLayout.

Bagian berikut menunjukkan penggunaan class binding yang dihasilkan dalam aktivitas dan fragmen.

Menggunakan view binding di aktivitas

Untuk menyiapkan instance class binding agar dapat digunakan dengan suatu aktivitas, lakukan langkah-langkah berikut dalam metode onCreate() aktivitas:

  1. Panggil metode inflate() statis yang disertakan dalam class binding yang dihasilkan. Tindakan ini membuat instance dari class binding yang akan digunakan aktivitas.
  2. Dapatkan referensi ke tampilan root dengan memanggil metode getRoot() atau menggunakan sintaksis properti Kotlin.
  3. Teruskan tampilan root ke setContentView() untuk menjadikan tampilan root tersebut sebagai tampilan aktif di layar.

Kotlin

    private lateinit var binding: ResultProfileBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }
    

Java

    private ResultProfileBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ResultProfileBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
    }
    

Sekarang, Anda dapat menggunakan instance class binding untuk merujuk ke tampilan mana pun:

Kotlin

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

Java

    binding.getName().setText(viewModel.getName());
    binding.button.setOnClickListener(new View.OnClickListener() {
        viewModel.userClicked()
    });
    

Menggunakan view binding di fragmen

Untuk menyiapkan instance class binding agar dapat digunakan dengan fragmen, lakukan langkah-langkah berikut dalam metode onCreateView() fragmen:

  1. Panggil metode inflate() statis yang disertakan dalam class binding yang dihasilkan. Tindakan ini membuat instance class binding yang akan digunakan fragmen.
  2. Dapatkan referensi ke tampilan root dengan memanggil metode getRoot() atau menggunakan sintaksis properti Kotlin.
  3. Tampilkan tampilan root dari metode onCreateView() untuk menjadikannya sebagai tampilan aktif di layar.

Kotlin

    private var _binding: ResultProfileBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
    

Java

    private ResultProfileBinding binding;

    @Override
    public View onCreateView (LayoutInflater inflater,
                              ViewGroup container,
                              Bundle savedInstanceState) {
        binding = ResultProfileBinding.inflate(inflater, container, false);
        View view = binding.getRoot();
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
    

Sekarang, Anda dapat menggunakan instance class binding untuk merujuk ke tampilan mana pun:

Kotlin

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

Java

    binding.getName().setText(viewModel.getName());
    binding.button.setOnClickListener(new View.OnClickListener() {
        viewModel.userClicked()
    });
    

Perbedaannya dengan findViewById

View binding memiliki keunggulan penting dibandingkan findViewById:

  • Keamanan null: Karena view binding menciptakan referensi langsung ke tampilan, tidak ada risiko pengecualian pointer null akibat ID tampilan yang tidak valid. Selain itu, jika tampilan hanya ada dalam beberapa konfigurasi tata letak, kolom yang berisi referensinya dalam class binding itu akan ditandai sebagai @Nullable.
  • Keamanan jenis: Kolom di setiap class binding memiliki jenis yang cocok dengan tampilan yang direferensikannya dalam file XML. Dengan begitu, tidak ada risiko pengecualian cast class.

Perbedaan ini berarti inkompatibilitas antara tata letak dan kode Anda akan menyebabkan build gagal pada waktu kompilasi, bukan pada waktu proses.

Perbandingan dengan data binding

View binding dan data binding keduanya menghasilkan class binding yang dapat Anda gunakan untuk mereferensikan tampilan secara langsung. Namun, view binding ditujukan untuk menangani kasus penggunaan yang lebih sederhana dan memberikan manfaat berikut dibandingkan data binding:

  • Kompilasi yang lebih cepat: View binding tidak memerlukan pemrosesan anotasi, sehingga waktu kompilasi menjadi lebih cepat.
  • Kemudahan penggunaan: View binding tidak memerlukan file tata letak XML yang diberi tag khusus, sehingga lebih mudah untuk diterapkan di aplikasi Anda. Setelah Anda mengaktifkan view binding dalam modul, view binding akan diterapkan ke semua tata letak modul tersebut secara otomatis.

Sebaliknya, view binding memiliki batasan berikut dibandingkan dengan data binding:

Karena pertimbangan ini, sebaiknya dalam beberapa kasus, gunakan view binding dan data binding dalam sebuah project. Anda dapat menggunakan data binding dalam tata letak yang memerlukan fitur lanjutan dan menggunakan view binding dalam tata letak yang tidak memerlukan fitur lanjutan.