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