Android Data Binding

Zobaczmy jak przygotować swoje środowisko programistyczne do pracy z biblioteką Data Binding Library, włączając w to wsparcie dla kodu wiążącego dane w Android Studio.

Krok 1. Włącz wiązanie danych:

Aby użyć wiązania danych w naszym projekcie, musimy je włączyć w pliku build.gradle na poziomie aplikacji.

dataBinding {
enabled = true
}

Krok 2. Zmień plik layoutu tak, aby można go było używać z wiązaniem danych:

Język wyrażeń pozwala na pisanie wyrażeń, które łączą zmienne z widokami w layoucie. Biblioteka wiązania danych automatycznie generuje klasy wymagane do powiązania widoków w układzie z obiektami danych. Biblioteka udostępnia funkcje, takie jak import, zmienne i elementy, których można używać w układach.

Aby layout mógł używać wiązania danych, najwyższy widok w layoucie powinien być widokiem <layout> lub innymi słowy, musimy zawinąć cały layout w znacznik <layout> w ten sposób:

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

Aby użyć danych z innych klas lub obiektów, musimy utworzyć obiekt danych wewnątrz pliku layoutu i zadeklarować w nim zmienną tej klasy lub obiektu.

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

Aby uniknąć błędów, wszystkie nazwy pakietów powinny zaczynać się od małych liter, a wszystkie nazwy klas danych powinny zaczynać się od dużych liter.

Krok 3. Utwórz obiekt wiążący w aktywności/fragmencie:

Teraz czas na połączenie naszego layoutu z aktywnością/fragmentem za pomocą wiązania danych.

Utwórz obiekt wiążący w pliku:
Typ wiązania wynika z nazwy pliku layoutu, np. jeśli plik layoutu nazywał się activity_main.xml, to data-binding utworzy klasę o nazwie ActivityMainBinding i ten plik będzie zawierał wszystkie wymagane właściwości i funkcje.

private lateinit var binding: ActivityMainBindingorprivate lateinit var binding: FragmentGameBinding

Inicjalizacja zmiennej wiążącej w metodzie onCreate():

Teraz musimy zainicjalizować wiązanie i zastąpić istniejącą metodę setContentView (). Można to zrobić poprzez wywołanie klasy DataBindingUtil lub poprzez bezpośrednie użycie typu wiążącego.

Dla aktywności typ wiążący nie może być użyty.

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

Krok 4. Użyj obiektu wiążącego:

Teraz możemy użyć utworzonego przez nas wiązania do dwóch celów:

  1. Zastąpienie wszystkich wywołań findViewById lub tylko syntetycznego importu przez wiązanie.<view’s id>.

e.g jeśli w layoucie znajduje się widok tekstowy o id sample_text, musimy go używać na jeden z dwóch podanych sposobów

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

Teraz zostanie on zastąpiony przez

binding.sampleText.text = "dummy_text"

Zauważ, że nazwa właściwości w klasie wiążącej jest po prostu wielkomianową formą ID widoku.

e.g sample_text staje się sampleText

2. Ustawienie zmiennej zadeklarowanej w obiekcie danych w layoucie, a następnie użycie jej w pliku layoutu.

Jeśli plik layoutu posiada zmienną o nazwie „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>

to musimy ustawić ją w activity/fragment

binding.user = User()

I teraz możemy użyć tego do wypełnienia danych widoku.

e.g jeśli istnieje widok tekstowy, który wyświetla imię użytkownika, to możemy użyć składni @{} do ustawienia wartości.

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

W ten sposób możemy uniknąć dużej ilości kodu, który trzeba wykonać, aby ustawić widoki programowo i pozwolić wiązaniu danych zająć się tym.

Leave a Reply