Biblioteka wiązań danych generuje klasy powiązań, które umożliwiają dostęp do zmiennych i widoków układu. Z tej dokumentacji dowiesz się, jak tworzyć dostosować wygenerowane klasy powiązań.
Wygenerowana klasa powiązania łączy zmienne układu z widokami w obrębie
układ. Możesz dostosować nazwę i pakiet
dla wiązania. Wszystkie wygenerowane klasy powiązań dziedziczą z
ViewDataBinding
.
Dla każdego pliku układu generowana jest klasa powiązania. Domyślnie jest to nazwa
to nazwa pliku układu przekonwertowanego na wielkość liter Pascal z klasą Wiązanie.
dodany sufiks. Jeśli więc na przykład nazwa pliku układu to
activity_main.xml
, odpowiadająca mu wygenerowana klasa to ActivityMainBinding
.
Ta klasa zawiera wszystkie powiązania od właściwości szablonu do
i wie, jak przypisywać wartości dla wyrażeń wiążących.
Tworzenie obiektu powiązania
Obiekt powiązania jest tworzony natychmiast po powiększeniu układu, by
upewnij się, że hierarchia widoków nie została zmodyfikowana, zanim powiążesz ją z widokami danych
wyrażeń w układzie. Najpopularniejsza metoda powiązania obiektu z
jest użycie metod statycznych dla klasy powiązania. Możesz zwiększyć
wyświetl hierarchię i powiąż z nią obiekt za pomocą metody inflate()
funkcji
zgodnie z poniższym przykładem:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater) setContentView(binding.root) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.root); }
Istnieje alternatywna wersja metody inflate()
, która pobiera
ViewGroup
oprócz
LayoutInflater
obiekt , jako
w tym przykładzie:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
Java
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
Jeśli układ został powiększony za pomocą innego mechanizmu, możesz go powiązać oddzielnie w taki sposób:
Kotlin
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
Java
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
Czasami nie znasz z wyprzedzeniem typu powiązania. W takich przypadkach możesz
utwórz powiązanie za pomocą funkcji
DataBindingUtil
zajęcia,
jak pokazano w tym fragmencie kodu:
Kotlin
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
Java
View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bind(viewRoot);
Jeśli używasz elementów wiązania danych wewnątrz
Fragment
ListView
lub
RecyclerView
adaptera, lepiej użyć
inflate()
metod klas powiązań lub
DataBindingUtil
,
w tym przykładowym kodzie:
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
Widoki z identyfikatorami
Biblioteka wiązań danych tworzy pole stałe w klasie powiązania dla instancji
z każdego widoku, który ma
identyfikator w układzie. Na przykład w bibliotece wiązań danych
tworzy pola firstName
i lastName
typu TextView
z metody
ten układ:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:id="@+id/firstName"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:id="@+id/lastName"/>
</LinearLayout>
</layout>
Biblioteka wyodrębnia widoki, w tym identyfikatory, z hierarchii widoków w
jedną kartę. Ten mechanizm może być szybszy niż wywoływanie funkcji
findViewById()
dla każdego widoku w układzie.
Identyfikatory nie są tak potrzebne, ponieważ nie wymagają wiązania danych, w niektórych przypadkach, gdy dostęp do widoków jest niezbędny z poziomu kodu.
Zmienne
Biblioteka wiązań danych generuje metody akcesorów dla każdej zadeklarowanej zmiennej
w układzie. Na przykład ten układ generuje metodę ustawiającą i pobierającą
metody w klasie powiązania dla zmiennych user
, image
i note
:
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
Wycinki widoku danych
W przeciwieństwie do zwykłych widoków obiektów ViewStub
zaczynają się od niewidocznych. Gdy są widoczne lub jawnie powiększone,
zastępują się w układzie, uzupełniając inny układ.
Ponieważ element ViewStub
znika z hierarchii widoków, widok w
obiekt powiązania musi też zniknąć, aby umożliwić jego wywołanie przez funkcję czyszczenia pamięci.
Widoki są ostateczne,
ViewStubProxy
obiekt
zastąpi ViewStub
w wygenerowanej klasie powiązania, dając Ci
dostęp do ViewStub
, kiedy już istnieje, oraz dostęp do rozszerzonego widoku
w hierarchii, gdy ViewStub
jest zawyżona.
Podczas tworzenia innego układu musisz dla niego ustanowić powiązanie.
Dlatego ViewStubProxy
musi nasłuchiwać ViewStub
.
OnInflateListener
.
i w razie potrzeby ustalić powiązania. Ponieważ w danym momencie może istnieć tylko jeden detektor
czas, ViewStubProxy
umożliwia ustawienie funkcji OnInflateListener
, która wywołuje funkcję
po ustanowieniu powiązania.
Natychmiastowe powiązanie
Zaplanowana jest zmiana zmiennej lub obserwowalnego obiektu po zmianie zmiennej lub obserwacyjnego obiektu.
przed następną klatką. Istnieją jednak sytuacje, w których powiązanie musi zostać wykonane
natychmiast. Aby wymusić wykonanie, użyj
executePendingBindings()
.
Zmienne dynamiczne
Czasami konkretna klasa powiązania jest nieznana. Na przykład plik
RecyclerView.Adapter
działanie w dowolnych układach nie zna konkretnej klasy powiązania. it
musi przypisać wartość powiązania podczas wywołania
onBindViewHolder()
.
W poniższym przykładzie wszystkie układy, z którymi jest powiązany element RecyclerView
, mają tag
item
. Obiekt BindingHolder
ma metodę getBinding()
zwracanie
ViewDataBinding
– podstawa
zajęcia.
Kotlin
override fun onBindViewHolder(holder: BindingHolder, position: Int) { item: T = items.get(position) holder.binding.setVariable(BR.item, item); holder.binding.executePendingBindings(); }
Java
public void onBindViewHolder(BindingHolder holder, int position) { final T item = items.get(position); holder.getBinding().setVariable(BR.item, item); holder.getBinding().executePendingBindings(); }
Wątek w tle
Model danych możesz zmienić w wątku w tle, o ile nie jest to kolekcji. Wiązanie danych lokalizuje wszystkie zmienne lub pola podczas oceny na uniknąć problemów z równoczesnością.
Nazwy niestandardowych klas powiązania
Domyślnie klasa powiązania jest generowana na podstawie nazwy pliku układu,
zaczyna się od wielkiej litery, usuń podkreślenia ( _ ), wielkie litery
kolejną literę z sufiksem wyrazu Wiązanie. Na przykład plik układu
contact_item.xml
generuje klasę ContactItemBinding
. Zajęcia zostaną umieszczone
w pakiecie databinding
w ramach pakietu modułów. Jeśli na przykład moduł
pakiet to com.example.my.app
, klasa powiązania jest umieszczona w tagu
com.example.my.app.databinding
.
Nazwy klas powiązań można zmieniać lub umieszczać w różnych pakietach za pomocą
Atrybut class
elementu data
. Na przykład ten układ
generuje klasę powiązania ContactItem
w pakiecie databinding
w funkcji
obecny moduł:
<data class="ContactItem">
...
</data>
klasę powiązania możesz wygenerować w innym pakiecie, dodając do niej przedrostek; z kropką. Ten przykład generuje klasę powiązania w tagu pakiet modułów:
<data class=".ContactItem">
...
</data>
Możesz też użyć pełnej nazwy pakietu, w którym ma być klasa powiązania
. Ten przykład tworzy klasę powiązania ContactItem
w
Pakiet com.example
:
<data class="com.example.ContactItem">
...
</data>
Dodatkowe materiały
Więcej informacji o powiązaniach danych znajdziesz w dodatkowych materiałach poniżej.
- Przykłady biblioteki Android Data Binding
- Powiązanie danych w Androidzie
- Powiązanie danych – wnioski
Polecane dla Ciebie
- Uwaga: tekst linku wyświetla się, gdy JavaScript jest wyłączony
- Układy i wyrażenia wiążące
- Biblioteka wiązań danych
- Wyświetl powiązanie