Android Data Binding

Lad os se, hvordan du gør dit udviklingsmiljø klar til at arbejde med Data Binding Library, herunder understøttelse af kode til databinding i Android Studio.

Stræk 1. Aktiver data-binding:

For at bruge data-binding i vores projekt skal vi aktivere det i app-niveau build.gradle-filen.

dataBinding {
enabled = true
}

Stræk 2. Ændre layoutfilen, så den kan bruges med data-binding:

Med udtrykssproget kan du skrive udtryk, der forbinder variabler med visningerne i layoutet. Biblioteket til datobinding genererer automatisk de klasser, der er nødvendige for at binde visningerne i layoutet med dine dataobjekter. Biblioteket indeholder funktioner som f.eks. import, variabler og includes, som du kan bruge i dine layouts.

For at layoutet kan bruge databinding, skal den øverste visning i layoutet være <layout>-visningen, eller med andre ord skal vi pakke hele layoutet ind i <layout>-tagget på følgende måde:

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

For at bruge data fra andre klasser eller objekter skal vi oprette et dataobjekt i layoutfilen og deklarere den pågældende klasses eller objekts 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>

For at undgå fejl skal alle pakkenavne begynde med små bogstaver, og alle dataklassernes navne skal begynde med store bogstaver.

Stræk 3. Opret et bindingsobjekt i aktiviteten/fragmentet:

Nu er det tid til at forbinde vores layout med aktiviteten/fragmentet ved hjælp af data-binding.

Opret et bindingsobjekt i filen:
Bindingstypen er afledt af navnet på layoutfilen. f.eks. hvis layoutfilens navn var activity_main.xml, så vil data-binding oprette en klasse ved navn ActivityMainBinding, og denne fil vil indeholde alle de nødvendige egenskaber og funktioner.

private lateinit var binding: ActivityMainBindingorprivate lateinit var binding: FragmentGameBinding

Initialisér bindingsvariablen i onCreate()-metoden:

Nu skal vi initialisere bindingen og erstatte den eksisterende setContentView ()-metode. Dette kan enten gøres ved at kalde DataBindingUtil-klassen eller ved direkte at bruge bindingstypen.

For activity binding type cannot be used.

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

Stræk 4. Brug bindingsobjektet:

Nu kan vi bruge den binding, vi har oprettet, til to formål:

  1. Opnå alle kald til findViewById eller kun den syntetiske import ved hjælp af binding.<view’s id>.

e.g hvis der er en tekstvisning i layoutet med id sample_text, skal vi bruge dette på en af de to givne måder

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

Nu erstattes dette af

binding.sampleText.text = "dummy_text"

Bemærk, at egenskabsnavnet i bindingsklassen blot er camelcase-formen af visningens id.

e.g sample_text bliver til sampleText

2. Indstilling af den variabel, der er erklæret i dataobjektet i layoutet, og derefter brug af den i layoutfilen.

Hvis layoutfilen har en variabel ved navn “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>

Så skal vi indstille denne i activity/fragment

binding.user = User()

Og nu kan vi bruge denne til at udfylde visningsdata.

Fors eksempelvis hvis der er en tekstvisning, der viser brugerens navn, kan vi bruge @{}-syntaksen til at angive værdien.

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

På denne måde kan vi undgå en masse kode, der skal bruges til at indstille visninger programmatisk, og lade data-binding tage sig af det.

Leave a Reply