Я пытаюсь использовать двустороннюю привязку данных в EditText, которая прекрасно работает, если я выставляю поле как MutableLiveData, как это обычно видно на примерах, которые я нашел в Интернете.
Однако есть веские причины не раскрывать MutableLiveData, и эти причины магически недействительны, потому что я решил использовать библиотеку привязки данных.
РЕДАКТИРОВАТЬ: основной мотивацией здесь является то, что MyViewModel должен контролировать данные настроек (это причина, почему не рекомендуется выставлять MutableLiveData
напрямую), в установщике я могу выполнить любые проверки или преобразования, необходимые, а затем просто позвоните setValue
на LiveData.
Я обычно выставляю LiveData
геттер и отдельный сеттер от моей ViewModel, я пытался заставить это работать с двусторонним связыванием данных, используя аннотацию InverseMethod()
, но это не сработает, потому что привязка данных ищет для обратного метода к getValue()
самой LiveData.
Вот простой пример:
public class MyViewModel extends ViewModel {
private MutableLiveData<String> mEmail = new MutableLiveData<>();
// @InverseMethod("setEmail") ### THIS DOESN'T WORK
public LiveData<String> getEmail() {
return mEmail;
}
// ### I WANT DATA-BINDING TO USE THIS METHOD
public void setEmail(String email) {
if (mEmail.getValue() != email) {
mEmail.setValue(email);
}
}
}
и вот как это нужно связать
<EditText
android:id="@+id/input_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewmodel.email}"/>
единственный обходной путь, который работает до сих пор, - это использование односторонней привязки данных для установки текста на EditText, а затем присоединение TextWatcher и вызова оттуда моего ViewModel.setter.
EDIT:
Второй обходной путь - расширить MutableLiveData, а затем выполнить проверки и преобразования в переопределенном setValue
... это много шаблонного для написания.