как объединить компоненты архитектуры с привязкой данных на android?
Я разработал базу приложений на базе библиотеки привязки данных android:https://developer.android.com/topic/libraries/data-binding/index.html
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
и теперь я хочу использовать ViewModelProviders из новой библиотеки: https://developer.android.com/topic/libraries/architecture/guide.html
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
как это совместить? есть идеи? или следует объединить эти две библиотеки?
редактировать
Я меняю на:
class SignInViewModel extends ViewModel {
public ObservableField<String> login = new ObservableField<>("");
public ObservableField<String> password = new ObservableField<>("");
}
и теперь компилируется, но вопрос в том: правильно ли это?
4 ответов
Это известная несовместимость. Вы не можете продлить BaseObservable
и AndroidViewModel
в то же время, поэтому вы не можете использовать @Bindable
создание двусторонней привязки данных невозможно*.
это будет исправлено после завершения Arch components 1.0 (на стороне привязки данных).
*Edit: вы можете сделать свой собственный ObservableViewModel:https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685
возможно, этого не существовало, когда был задан вопрос, но в этой статье объясняется другой вариант: https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038
В основном вместо расширения от BaseObservable вы можете реализовать android.привязка данных.наблюдаемых.
Это немного больше работы, так как необходимо выполнить следующее:
-
создать эта переменная в вашем классе модели
private PropertyChangeRegistry registry = new PropertyChangeRegistry();
-
реализовать переопределенные методы, как это
@Override public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) { registry.add(callback); } @Override public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) { registry.remove(callback); }
-
замените все вызовы" BR " следующими:
registry.notifyChange(this, BR.bar);
все остальное работает так же, как расширение от BaseObservable. Так что я думаю, возможно, это то решение, на которое намекал Хосе, которого тогда, вероятно, не было. Это, кажется, работает.
обновление: As Евгений Брусов отметил, что теперь вы можете использовать LiveData с привязкой данных. Это то, что я делаю сейчас, и это намного проще с меньшим шаблоном. См.https://developer.android.com/topic/libraries/data-binding/architecture.
это возможно с Android Studio 3.1 Canary 6 (https://androidstudio.googleblog.com/2017/12/android-studio-31-canary-6-is-now.html):
теперь можно использовать объект LiveData в качестве наблюдаемого поля в выражениях привязки данных. Класс ViewDataBinding теперь включает новый метод setLifecycle, который необходимо использовать для наблюдения объектов LiveData.
вы можете найти более подробную информацию и примеры в этой средний пост.
Это также можно решить с помощью обертки:
class SignInViewModelWrapper extends ViewModel {
public final SignInViewModel model = new SignInViewModel();
}
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
затем вы можете получить модель представления следующим образом:
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModelWrapper.class).model;