Я реорганизую свое приложение Android для университетского проекта, чтобы использовать компоненты архитектуры, и мне трудно реализовать двустороннюю привязку данных к SwitchCompat
. Приложение имеет простой пользовательский интерфейс с TextView
, отображающим статус обновлений местоположения, и вышеупомянутым SwitchCompat
, который включает и выключает обновления местоположения.
Сейчас я использую одностороннюю привязку данных к атрибуту checked
SwitchCompat
, но хотел бы использовать двустороннюю привязку данных.
Текущая реализация с использованием архитектуры 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);
}
}
}
Resource‹Location> (увидел идею здесь) — это класс, содержащий данные, допускающие значение NULL. (местоположение) и ненулевое состояние, которое может обрабатывать TextView
:
State.java
public enum State {
LOADING,
UPDATE,
UNKNOWN,
STOPPED
}
А теперь реализация android:onCheckedChanged
в fragment_main.xml:
android:onCheckedChanged="@{(buttonView, isChecked) -> viewModel.onCheckedChanged(context, isChecked)}"
И, наконец, настраиваемый адаптер привязки для преобразования из состояния в логическое проверенное состояние:
@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
в fragment_main.xml:
android:checked="@{viewModel.getLocationResource}"
Как сказано в руководстве для разработчиков Android, на которое я ссылался выше, как я могу выполнять всю работу внутри android:checked
вместо использования android:checked
и android:onCheckedChanged
(односторонняя привязка данных к двусторонней привязке данных)?
Кроме того, дайте мне знать, если вы думаю, что архитектуру/логику моего приложения можно улучшить :)