Android Data Binding

Vediamo come preparare il nostro ambiente di sviluppo per lavorare con la libreria Data Binding, incluso il supporto per il codice data binding in Android Studio.

Passo 1. Abilitare il data-binding:

Per utilizzare il data binding nel nostro progetto dobbiamo abilitarlo nel file build.gradle a livello di app.

dataBinding {
enabled = true
}

Step 2. Modificare il file di layout per essere utilizzabile con il data-binding:

Il linguaggio di espressione permette di scrivere espressioni che collegano le variabili alle viste nel layout. La libreria Data Binding genera automaticamente le classi necessarie per legare le viste nel layout con i tuoi oggetti dati. La libreria fornisce caratteristiche come importazioni, variabili e include che puoi usare nei tuoi layout.

Per fare in modo che il layout usi il data binding, la vista più in alto nel layout dovrebbe essere la vista <layout> o in altri termini, dobbiamo avvolgere l’intero layout nel tag <layout> come questo:

<layout>
<ConstraintLayout… /> <! - UI layout's root element →
</layout>

Per usare dati da altre classi o oggetti dobbiamo creare un oggetto dati all’interno del file di layout e dichiarare la variabile di quella classe o oggetto in esso.

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.myapp.data.User" />
</data>
<ConstraintLayout… /> <! - UI layout's root element →
</layout>

Per evitare errori tutti i nomi dei pacchetti dovrebbero iniziare con l’alfabeto minuscolo e tutti i nomi delle classi di dati dovrebbero iniziare con l’alfabeto maiuscolo.

Step 3. Creare un oggetto binding nell’attività/frammento:

Ora è il momento di collegare il nostro layout all’attività/frammento usando il data-binding.

Creare un oggetto binding nel file:
Il tipo di binding deriva dal nome del file di layout. ad esempio se il nome del file di layout è activity_main.xml, allora data-binding creerà una classe chiamata ActivityMainBinding e questo file includerà tutte le proprietà e le funzioni richieste.

private lateinit var binding: ActivityMainBindingorprivate lateinit var binding: FragmentGameBinding

Inizializzare la variabile binding nel metodo onCreate():

Ora dobbiamo inizializzare il binding e sostituire il metodo setContentView () esistente. Questo può essere fatto chiamando la classe DataBindingUtil o usando direttamente il tipo di binding.

Per attività il tipo di binding non può essere usato.

//for activity (in onCreate())
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)//for fragment (in onCreateView())
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_game, container, false)orbinding = FragmentGameBinding.inflate(inflater)

Step 4. Usare l’oggetto binding:

Ora possiamo usare il binding che abbiamo creato per due scopi:

  1. Sostituendo tutte le chiamate a findViewById o solo le importazioni sintetiche tramite binding.< id della vista>.

e.g se c’è una vista di testo nel layout con id sample_text, dobbiamo usare questo in uno dei due modi indicati

findViewById<TextView>(R.id.sample_text).apply{
text = "dummy text"
}or simply using synthetic importsample_text.text = "dummy_text"

Ora questo sarà sostituito da

binding.sampleText.text = "dummy_text"

Nota che il nome della proprietà nella classe binding è solo la forma camelcase dell’ID della vista.

e.g sample_text diventa sampleText

2. Impostare la variabile dichiarata nell’oggetto dati nel layout e poi usarla nel file di layout.

Se il file di layout ha una variabile chiamata “user”

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.myapp.data.User" />
</data>
<ConstraintLayout… /> <! - UI layout's root element →
</layout>

Allora dobbiamo impostarla in activity/fragment

binding.user = User()

E ora possiamo usarla per popolare i dati della vista.

Per esempio, se c’è una vista di testo che visualizza il nome dell’utente, allora possiamo usare la sintassi @{} per impostare il valore.

<TextView 
...
android:text="@{user.userName}"
...
/>

In questo modo, possiamo evitare un sacco di codice da fare per impostare le viste programmaticamente e lasciare che il data-binding se ne occupi.

Leave a Reply