Biblioteka AndroidaX zawiera architekturę Komponenty, które można wykorzystywać do projektowania zaawansowanych aplikacji, które można przetestować i łatwo utrzymywać. Biblioteka wiązań danych bezproblemowo współpracuje z architekturą komponenty, które jeszcze bardziej upraszczają programowania interfejsu użytkownika. Układy w aplikacji tworzyć powiązania z danymi w komponentach architektury, co pomaga zarządza cyklem życia kontrolera UI i powiadamia go o zmianach w danych.
Na tej stronie dowiesz się, jak włączyć komponenty architektury do swojej aplikacji, jak najlepiej wykorzystać możliwości biblioteki wiązań danych.
Używaj LiveData do powiadamiania UI o zmianach w danych
Obiektów LiveData możesz używać jako:
źródła powiązania danych, aby automatycznie powiadamiać UI o zmianach w
i skalowalnych danych. Więcej informacji o tym komponencie architektury można znaleźć w artykule LiveData
.
Odróżnianie obiektów, które implementują
Observable – na przykład
zauważalne
pola – LiveData
obiekty znają cykl życia obserwatorów subskrybujących dane
zmian. Wiedza ta zapewnia wiele korzyści, które zostały opisane w
zalety używania
LiveData.
W Android Studio w wersji 3.1 lub nowszej możesz zastępować obserwowalne pola
z LiveData obiektami w kodzie powiązania danych.
Aby użyć obiektu LiveData z klasą powiązania, musisz określić
właściciela cyklu życia, aby zdefiniować zakres obiektu LiveData. Poniżej
w tym przykładzie określa działanie jako właściciela cyklu życia po klasie powiązania
utworzono instancję:
Kotlin
class ViewModelActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Inflate view and obtain an instance of the binding class. val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user) // Specify the current activity as the lifecycle owner. binding.setLifecycleOwner(this) } }
Java
class ViewModelActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Inflate view and obtain an instance of the binding class. UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user); // Specify the current activity as the lifecycle owner. binding.setLifecycleOwner(this); } }
ViewModel
zgodnie z instrukcjami w następnej sekcji, by powiązać dane z układem. W komponencie ViewModel
możesz użyć obiektu LiveData do przekształcenia danych lub scalenia wielu danych
źródeł. Ten przykład pokazuje, jak przekształcić dane w elemencie ViewModel:
Kotlin
class ScheduleViewModel : ViewModel() { val userName: LiveDatainit { val result = Repository.userName userName = Transformations.map(result) { result -> result.value } } }
Java
class ScheduleViewModel extends ViewModel { LiveDatausername; public ScheduleViewModel() { String result = Repository.userName; userName = Transformations.map(result, result -> result.value); } }
Używanie modelu ViewModel do zarządzania danymi związanymi z interfejsem użytkownika
Biblioteka wiązań danych współpracuje bezproblemowo z
ViewModel. ViewModel
ujawnia dane obserwowane przez układ i reaguje na jego zmiany. Zastosowanie
Komponenty ViewModel z biblioteką Data Binding umożliwiają przenoszenie logiki interfejsu użytkownika
w układach i komponentach, które łatwiej przetestować. Dane
Biblioteka powiązań zapewnia, że widoki danych są powiązane i niepowiązane z danymi
w razie potrzeby. Pozostała część pracy polega głównie na upewnieniu się,
pokazujesz
właściwe dane. Aby uzyskać więcej informacji o tej architekturze
Komponent, zapoznaj się z kolumną ViewModel
.
Aby używać komponentu ViewModel z biblioteką powiązań danych, musisz
utworzyć instancję komponentu, który dziedziczy z instancji
ViewModel, zdobądź
instancji klasy powiązania i przypisz komponent ViewModel do
w klasie powiązania. Poniższy przykład pokazuje, jak używać atrybutu
z biblioteką:
Kotlin
class ViewModelActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Obtain the ViewModel component. val userModel: UserModel by viewModels() // Inflate view and obtain an instance of the binding class. val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user) // Assign the component to a property in the binding class. binding.viewmodel = userModel } }
Java
class ViewModelActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Obtain the ViewModel component. UserModel userModel = new ViewModelProvider(this).get(UserModel.class); // Inflate view and obtain an instance of the binding class. UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user); // Assign the component to a property in the binding class. binding.viewmodel = userModel; } }
W układzie przypisz właściwości i metody komponentu ViewModel
do odpowiednich widoków za pomocą wyrażeń wiążących, jak pokazano poniżej
przykład:
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@{viewmodel.rememberMe}"
android:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />
Użyj Observable ViewModel, aby uzyskać większą kontrolę nad adapterami powiązań
ViewModel
który implementuje kod
interfejs Observable
aby powiadomić innych
o zmianach w danych, podobnie jak w przypadku
LiveData obiekt.
Istnieją sytuacje, w których możesz chcieć użyć atrybutu
Komponent ViewModel, który implementuje Observable
za pomocą obiektów LiveData, nawet jeśli utracisz cykl życia
możliwości zarządzania LiveData. Za pomocą komponentu ViewModel, który
Observable daje większą kontrolę nad adapterami
. Ten wzór zapewnia na przykład większą kontrolę nad powiadomieniami
gdy dane ulegną zmianie; pozwala też określić niestandardową metodę ustawiania
wartości atrybutu w dwukierunkowym wiązaniu danych.
Aby zaimplementować obserwowalny komponent ViewModel, musisz utworzyć klasę, która
dziedziczy z klasy ViewModel i implementuje funkcję Observable
za pomocą prostego interfejsu online. Możesz zastosować niestandardową logikę, gdy obserwator subskrybują lub
anuluje subskrypcję powiadomień przez
addOnPropertyChangedCallback()
oraz
removeOnPropertyChangedCallback()
. Możesz też udostępnić niestandardową logikę uruchamianą, gdy właściwości zmienią się
notifyPropertyChanged()
. Poniższy przykładowy kod pokazuje, jak wdrożyć obiekt dostrzegalny
ViewModel:
Kotlin
/** * A ViewModel that is also an Observable, * to be used with the Data Binding Library. */ open class ObservableViewModel : ViewModel(), Observable { private val callbacks: PropertyChangeRegistry = PropertyChangeRegistry() override fun addOnPropertyChangedCallback( callback: Observable.OnPropertyChangedCallback) { callbacks.add(callback) } override fun removeOnPropertyChangedCallback( callback: Observable.OnPropertyChangedCallback) { callbacks.remove(callback) } /** * Notifies observers that all properties of this instance have changed. */ fun notifyChange() { callbacks.notifyCallbacks(this, 0, null) } /** * Notifies observers that a specific property has changed. The getter for the * property that changes must be marked with the @Bindable annotation to * generate a field in the BR class to be used as the fieldId parameter. * * @param fieldId The generated BR id for the Bindable field. */ fun notifyPropertyChanged(fieldId: Int) { callbacks.notifyCallbacks(this, fieldId, null) } }
Java
/** * A ViewModel that is also an Observable, * to be used with the Data Binding Library. */ class ObservableViewModel extends ViewModel implements Observable { private PropertyChangeRegistry callbacks = new PropertyChangeRegistry(); @Override protected void addOnPropertyChangedCallback( Observable.OnPropertyChangedCallback callback) { callbacks.add(callback); } @Override protected void removeOnPropertyChangedCallback( Observable.OnPropertyChangedCallback callback) { callbacks.remove(callback); } /** * Notifies observers that all properties of this instance have changed. */ void notifyChange() { callbacks.notifyCallbacks(this, 0, null); } /** * Notifies observers that a specific property has changed. The getter for the * property that changes must be marked with the @Bindable annotation to * generate a field in the BR class to be used as the fieldId parameter. * * @param fieldId The generated BR id for the Bindable field. */ void notifyPropertyChanged(int fieldId) { callbacks.notifyCallbacks(this, fieldId, null); } }
Dodatkowe materiały
Aby dowiedzieć się więcej o wiązaniu danych, zapoznaj się z tymi artykułami z dodatkowymi zasobami.
Polecane dla Ciebie
- Uwaga: tekst linku wyświetla się, gdy JavaScript jest wyłączony
- Praca z obserwowalnymi obiektami danych
- Wczytywanie i wyświetlanie danych z podziałem na strony
- Używanie współprogramów Kotlin z komponentami dostosowanymi do cyklu życia