Android Data Binding

Podívejme se, jak připravit vývojové prostředí na práci s knihovnou Data Binding Library, včetně podpory kódu datových vazeb v aplikaci Android Studio.

Krok 1. Povolení datové vazby:

Chceme-li v našem projektu používat datovou vazbu, musíme ji povolit v souboru build.gradle na úrovni aplikace.

dataBinding {
enabled = true
}

Krok 2. Změňte soubor rozvržení tak, aby byl použitelný s data-binding:

Výrazový jazyk umožňuje psát výrazy, které propojují proměnné s pohledy v rozvržení. Knihovna datových vazeb automaticky generuje třídy potřebné k provázání pohledů v rozvržení s vašimi datovými objekty. Knihovna poskytuje funkce, jako jsou importy, proměnné a includy, které můžete použít ve svých rozvrženích.

Pro použití datové vazby v rozvržení by měl být nejvyšším pohledem v rozvržení pohled <layout> nebo jinak řečeno, musíme celé rozvržení zabalit do značky <layout> takto:

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

Pro použití dat z jiných tříd nebo objektů musíme vytvořit datový objekt uvnitř souboru rozvržení a deklarovat v něm proměnnou této třídy nebo objektu.

<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 se předešlo chybám, měly by všechny názvy balíčků začínat malými písmeny a názvy všech datových tříd by měly začínat velkými písmeny.

Krok č. 3. Vytvoření objektu vazby v aktivitě/fragmentu:

Nyní je čas propojit náš layout s aktivitou/fragmentem pomocí datové vazby.

Vytvořte objekt vazby v souboru:
Typ vazby je odvozen od názvu souboru layoutu. např. pokud se soubor layoutu jmenoval activity_main.xml, pak datová vazba vytvoří třídu s názvem ActivityMainBinding a tento soubor bude obsahovat všechny požadované vlastnosti a funkce.

private lateinit var binding: ActivityMainBindingorprivate lateinit var binding: FragmentGameBinding

Inicializujte proměnnou vazby v metodě onCreate():

Nyní musíme vazbu inicializovat a nahradit stávající metodu setContentView (). To můžeme provést buď voláním třídy DataBindingUtil, nebo přímo pomocí typu vazby.

Pro aktivitu nelze typ vazby použít.

//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. Zvolíme-li typ vazby DataBindingUtil, můžeme jej použít. Použití vazebního objektu:

Nyní můžeme použít vytvořenou vazbu ke dvěma účelům:

  1. Záměna všech volání findViewById nebo jen syntetických importů pomocí vazby.<id pohledu>.

e.g pokud je v rozvržení textový pohled s id sample_text, musíme jej použít jedním ze dvou uvedených způsobů

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

Nyní bude nahrazen

binding.sampleText.text = "dummy_text"

Všimněte si, že název vlastnosti ve vazební třídě je pouze camelcase forma ID pohledu.

e.g sample_text se stane sampleText

2. Nastavení proměnné deklarované v datovém objektu v rozvržení a její následné použití v souboru rozvržení.

Pokud má soubor rozvržení proměnnou s názvem „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>

Tak ji musíme nastavit v aktivitě/fragmentu

binding.user = User()

A nyní ji můžeme použít pro naplnění dat pohledů.

Např. pokud existuje textový pohled, který zobrazuje jméno uživatele, pak můžeme pro nastavení hodnoty použít syntaxi @{}.

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

Tímto způsobem se můžeme vyhnout spoustě kódu, který je třeba udělat pro programové nastavení pohledů, a nechat data-binding, aby se o to postaral.

Leave a Reply