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