Я реорганизую свое Android-приложение для университетского проекта, чтобы использовать компоненты архитектуры, и мне трудно реализовать двустороннюю привязку данных на SwitchCompat
.Приложение имеет простой пользовательский интерфейс с TextView
отображением статуса обновлений местоположения и вышеупомянутым SwitchCompat
, который включает и выключает обновления местоположения.
На данный момент я использую одностороннюю привязку данных на SwitchCompat
атрибут checked
, но хотелось бы использовать двустороннюю привязку данных .
Текущая реализация с использованием архитектуры Model-View-ViewModel выглядит следующим образом:
MainViewModel.java :
public class MainViewModel extends ViewModel {
private LiveData<Resource<Location>> mLocationResource;
public MainViewModel() {
mLocationResource = Repository.getInstance().getLocationResource();
}
public LiveData<Resource<Location>> getLocationResource() {
return mLocationResource;
}
public void onCheckedChanged (Context context, boolean isChecked) {
if (isChecked) {
Repository.getInstance().requestLocationUpdates(context);
} else {
Repository.getInstance().removeLocationUpdates(context);
}
}
}
Ресурс (увидел идею здесь ) - это класс, содержащий обнуляемые данные (Location) и ненулевое состояние TextView
может обрабатывать:
State.java
public enum State {
LOADING,
UPDATE,
UNKNOWN,
STOPPED
}
А теперь реализация android:onCheckedChanged
в frag_main.xml :
android:onCheckedChanged="@{(buttonView, isChecked) -> viewModel.onCheckedChanged(context, isChecked)}"
* 1031И, наконец, настраиваемый адаптер привязки для преобразования из состояния в логическое проверенное состояние:
@BindingAdapter({"android:checked"})
public static void setChecked(CompoundButton view, Resource<Location> locationResource) {
State state = locationResource.getState();
boolean checked;
if (state == State.STOPPED) {
checked = false;
} else {
checked = true;
}
if (view.isChecked() != checked) {
view.setChecked(checked);
}
}
и реализация атрибута android:checked
в frag_main.xml :
android:checked="@{viewModel.getLocationResource}"
Как я уже говорил в руководстве для разработчиков Android, как я могу сделать всеl работа внутри android:checked
вместо android:checked
и android:onCheckedChanged
(односторонняя привязка данных к двусторонней привязке данных)?
Также, пожалуйста, дайте мне знать, если вы думаете об архитектуре / логике моего приложенияможет быть улучшено:)