как объединить компоненты архитектуры с привязкой данных на 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.привязка данных.наблюдаемых.

Это немного больше работы, так как необходимо выполнить следующее:

  1. создать эта переменная в вашем классе модели

    private PropertyChangeRegistry registry = new PropertyChangeRegistry();
    
  2. реализовать переопределенные методы, как это

    @Override
    public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.add(callback);
    }
    
    @Override
    public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
        registry.remove(callback);
    }
    
  3. замените все вызовы" 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;