В последнем Google IO Google выпустил предварительный просмотр некоторых новых компонентов дуги, один из которых, ViewModel.
В документах google показывает одно из возможных вариантов использования этого компонента:
Очень часто бывает, что два или более фрагмента в действии должны взаимодействовать друг с другом. Это никогда не бывает тривиальным, поскольку оба фрагмента должны определять описание интерфейса, а активность владельца должна связывать их вместе. Более того, оба фрагмента должны обрабатывать случай, когда другой фрагмент еще не создан или невидим.
Эта общая точка боли может быть устранена с помощью объектов ViewModel. Представьте общий пример фрагментов мастер-детали, где у нас есть фрагмент, в котором пользователь выбирает элемент из списка и другой фрагмент, который отображает содержимое выбранного элемента.
Эти фрагменты могут совместно использовать ViewModel, используя их область действия для обработки этого сообщения.
И показывает пример реализации:
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onActivityCreated() {
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends LifecycleFragment {
public void onActivityCreated() {
SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, { item ->
// update UI
});
}
}
Я был очень взволнован возможностью не нуждаться в тех интерфейсах, которые использовались для фрагментов для связи через активность.
Но пример Google точно не показывает, как я могу назвать фрагмент детали из мастера.
Я все равно должен использовать интерфейс, который будет реализован в результате активности, которая вызовет функцию fragmentManager.replace(...), или есть другой способ сделать это с использованием новой архитектуры?