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