да. Я хотел бы знать, есть ли способ, чтобы один фрагмент вызывал другой напрямую, используя новые компоненты. Но я думаю, что их цель - решить эту проблему.
st Google IO Google выпустил предварительный просмотр некоторых новых компонентов Arch, один из которых, 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 не показывает, как именно я бы назвал фрагмент детали от мастера.
Я все еще должен использоватьинтерфейс это будет реализовано действием, которое будет вызывать фрагментManager.replace (...), или есть другой способ сделать это, используя новую архитектуру?