View Binding è una funzionalità che permette di scrivere oiù facilmente codice che interagisce con le View. Una volta abilitato il View binding in un modulo, genera una classe binding per ogni file layout XML presenti in quel modulo. Un;istanza di una binding class contiene riferimenti diretti a tutte le view che hanno un ID nel layout corrispondente.
In molti casi, view binding sostituisce findViewById.
View binding viene abilitato in base al modulo. Per abilitare view binding in un modulo, impostare l'opzione viewBinding come true nel file build.gradle, come mostrato nel seguente esempio:
android { ... buildFeatures { viewBinding = true } }
Se volete che un file di layout venga ignorato quando vengono generate le classi binding, potete aggiungere l'attributo tools:viewBindingIgnore="true" nella view "root" di quel file di layout:
<LinearLayout ... tools:viewBindingIgnore="true" > ... </LinearLayout>
Se view binding è abilitato per un modulo, una classe binding viene generata per ogni file layout XML che quel modulo contiene. Ogni binding class contiene riferimenti alla view root e a tutte le view che hanno un ID. Il nome della binding class è generato convertendo il nome del file XML in Pascal case e aggiungendo la parola "binding" alla fine.
Per esempio, dato un file di layout chiamato result_profile.xml
:
<LinearLayout ... > <TextView android:id="@+id/name" /> <ImageView android:cropToPadding="true" /> <Button android:id="@+id/button" android:background="@drawable/rounded_button" /> </LinearLayout>
La binding class generata si chiama ResultProfileBinding. Questa classe ha due campi: una TextView chiamata name e un Button chiamato button. L' ImageView nel layout non ha un' ID, quindi non ci sono riferimenti ad essa nella binding class.
Ogni binding class include anche un metodo getRoot(), che fornisce un riferimento diretto alla view root del file di layout corrispondente. In questo esempio, il metodo getRoot() nella classe ResultProfileBinding restituisce la view root LinearLayout
Le seguenti sezioni dimostrano l'utilizzo di binding class generate in attività e frammenti.
Per impostare un'istanza della binding class da utilizzare in un'attività, effettuare I seguenti step nel metodo onCreate() dell'attività:
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
Ora potete utilizzare l'istanza della binding class per riferirvi a ognuna delle view:
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Per impostare un'istanza della binding class da utilizzare con un frammento, effettuare I seguenti step nel metodo onCreateView() del frammento:
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 }
Ora potete utilizzare l'istanza della binding class per riferirvi a ognuna delle view:
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
View binding ha dei notevoli vantaggi rispetto l'utilizzo di findViewById:
Queste differenze significano che incompatibilità tra il vostro layout e il vostro codice causeranno il fallimento della vostra build durante la compilazione e non durante l'esecuzione.
View binding e data binding generano ambedue binding classes che potete utilizzare per riferirvi direttamente alle views. View binding però è inteso per gestire casi più semplici e fornisce I seguenti vantaggi rispetto a data binding:
Di converso, view binding ha le secguenti limitazioni rispetto a data binding:
Grazie a queste considerazioni, in alcuni casi la miglior cosa da fare è utilizzare sia il view binding che il data binding. Potete utilizzare data binding in layout che richiedono funzionalità avanzate e utilizzare view bidning in layout che non le richiedono.