View Binding in Android (parte di Android Jetpack)

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.


Installazione

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>

Utilizzo di View Binding

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.


Utilizzo di view binding nelle attività

Per impostare un'istanza della binding class da utilizzare in un'attività, effettuare I seguenti step nel metodo onCreate() dell'attività:

  1. Chiamare il metodo statico inflate() incluso nella binding class generata. Questo crea un'istanza della binding class per l'attività da utilizzare.
  2. Ottenere un riferimento alla view root chiamando il metodo getRoot() o utilizzando la sintassi di proprietà di Kotlin
  3. Passare la view root a setContentView() per renderla la view attiva sullo schermo.
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() }

Utilizzo di view binding nei frammenti

Per impostare un'istanza della binding class da utilizzare con un frammento, effettuare I seguenti step nel metodo onCreateView() del frammento:

  1. Chiamare il metodo statico inflate() incluso nella binding class generata. Questo crea un'istanza della binding class per il frammento da utilizzare.
  2. Ottenere un riferimento alla view root chiamando il metodo getRoot() o utilizzando la sintassi di proprietà di Kotlin
  3. Restituire la view root dal metodo onCreateView() per renderla la view attiva sullo schermo.
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() }

Differenze con findViewById

View binding ha dei notevoli vantaggi rispetto l'utilizzo di findViewById:

  • Null safety: Siccome view binding crea riferimenti diretti alla view, non c'e' rischio di null pointer exception a cause di un ID non valido della view. Inoltre, quando una view è presente in solo alcune configurazioni di un layout, il campo contenente il suo riferimento nella binding class è marcato come @Nullable.
  • Type safety: I campi in ogni binding class hanno tipi abbinati alle view cui si riferiscono nel file XML. Il che significa che non c'e' rischio di class cast exception.

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.


Comparazione con data binding

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:

  • Compilazione più veloce: View binding non richiede processi di annotazione, quindi I tempi di compilazione sono più veloci.
  • Facilità di utilizzo: View binding non richiede files di layout XML con tag speciali, per cui è più veloce da adottare nlle vostre app. Una volta abilitato il view binding in un modulo, viene applicato a tutti I layout di quel modulo automaticamente.

Di converso, view binding ha le secguenti limitazioni rispetto a data binding:

  • View binding non supporta variabili di layout o espressioni di layout, per cui non può essere utilizzato per dichiarare contenuti UI dinamici direttamente dal file di layout XML.
  • View binding non supporta two-way 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.

Copyright © 2024.
Tutti i diritti riservati. outsourcingasia.it
TECHCONSULTI CO. LTD.

Copyright © 2024. Tutti i diritti riservati. outsourcingasia.it - TECHCONSULTI CO. LTD.