Android Data Binding

Vi ska se hur du gör din utvecklingsmiljö redo att arbeta med biblioteket för databindning, inklusive stöd för kod för databindning i Android Studio.

Steg 1. Aktivera databindning:

För att använda databindning i vårt projekt måste vi aktivera det i filen build.gradle på app-nivå.

dataBinding {
enabled = true
}

Steg 2. Ändra layoutfilen så att den kan användas med databindning:

Med uttrycksspråket kan du skriva uttryck som ansluter variabler till vyerna i layouten. Biblioteket för databindning genererar automatiskt de klasser som krävs för att binda vyerna i layouten med dina dataobjekt. Biblioteket tillhandahåller funktioner som import, variabler och inkluderingar som du kan använda i dina layouter.

För att layouten ska kunna använda databindning bör den översta vyn i layouten vara vyn <layout>, eller med andra ord måste vi slå in hela layouten i <layout>-taggen på följande sätt:

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

För att kunna använda data från andra klasser eller objekt måste vi skapa ett dataobjekt i layoutfilen och deklarera den klassens eller objektets variabel i den.

<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>

För att undvika fel bör alla paketnamn börja med små bokstäver och alla dataklassers namn bör börja med stora bokstäver.

Steg 3. Skapa ett bindningsobjekt i aktiviteten/fragmentet:

Nu är det dags att ansluta vår layout till aktiviteten/fragmentet med hjälp av databindning.

Skapa ett bindningsobjekt i filen:
Typen av bindning härleds från namnet på layoutfilen, t.ex. om layoutfilens namn var activity_main.xml, så kommer data-bindning att skapa en klass som heter ActivityMainBinding och denna fil kommer att innehålla alla nödvändiga egenskaper och funktioner.

private lateinit var binding: ActivityMainBindingorprivate lateinit var binding: FragmentGameBinding

Initialisera bindningsvariabeln i onCreate()-metoden:

Nu måste vi initialisera bindningen och ersätta den befintliga setContentView ()-metoden. Detta kan antingen göras genom att kalla klassen DataBindingUtil eller genom att direkt använda bindningstypen.

För aktivitet kan bindningstypen inte användas.

//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)

Steg 4. Använd bindningsobjektet:

Nu kan vi använda bindningen vi skapat för två ändamål:

  1. Replacera alla anrop till findViewById eller bara de syntetiska importerna genom att binda.<vyns id>.

e.t.ex. om det finns en textvy i layouten med id sample_text, måste vi använda detta på något av de två angivna sätten

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

Nu kommer detta att ersättas med

binding.sampleText.text = "dummy_text"

Notera att egenskapsnamnet i bindningsklassen bara är kamelbokstavsformen av vyns ID.

t.ex. sample_text blir sampleText

2. Ställ in variabeln som deklarerats i dataobjektet i layouten och använd den sedan i layoutfilen.

Om layoutfilen har en variabel som heter ”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>

Då måste vi ställa in denna i activity/fragment

binding.user = User()

Och nu kan vi använda denna för att fylla på visningsdata.

Om det t.ex. finns en textvy som visar användarens namn kan vi använda @{}-syntaxen för att ställa in värdet.

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

På det här sättet kan vi undvika en hel del kod för att ställa in vyer programmatiskt och låta data-bindning ta hand om det.

Leave a Reply