Как должно быть организовано общение между презентером MainActivity и презентерами Fragment/Controller(Conductor's View) при реализации Single Activity?
Пока 2 варианта:
1) Презентер Fragment имеет ссылку на презентер MainActivity и вызывает его методы
2) Fragment напрямую вызывает методы MainActivity, а тот вызывает методы своего презентера
И еще вопрос:
Допустимо ли иметь во View методы инициализации (init..., setup...) и вызывать их в конструкторе View, или всё-таки надо, чтобы презентер их вызвал?
Презентеры должны быть связанны через слой данных. Но если очень нужно, то можно обращаться к родительскому активити, через методы интерфейса, и далее оно уже само работает со своим презентером.
Александр Варакосов, ну и что, что он встречается? Снекбар это вьюха чистой воды. Ещё есть уникумы, которые данные в статических переменных хранят, тоже будем так советовать? А что, встречается же.
terminator-light, это значит, что состояние вьюшки должно определяться данными. Вы что-то сделали в одной части приложения, записали это в некое хранилище, при переходе в другую часть - получили данные из хранилища и отрисовали интерфейс.
Методы инициализации во View не нужны. В случае фрагмента, есть штатный onCreateView().
Александр Варакосов, Допустим, есть FragmentPresenter и MainActivityPresenter, который имеет методы по изменению контента тулбара. Как вы сказали есть слой данных Repository.
FragmentPresenter'у нужно изменить разметку тулбара. Он вызывает метод Repository и меняет значение. Что нужно сделать, чтобы активити узнало об изменении данных в Repository без вызова напрямую метода MainActivity или MainActivityPresenter?
В приложении одно активити и множество контроллеров (контроллер - аналог фрагмента из библиотеки Conductor)
Александр Варакосов, у меня не фрагмент, а контроллер. Фрагмент я приводил для простоты описания.
Т.е. я могу из фрагмента в основной тулбар поместить целую разметку с ConstraintLayout с увеличением высоты тулбара и с удалением отступов у заголовка тулбара прямо в
onCreateOptionsMenu()?
Александр Варакосов, вы сказали, что презентеры должны общаться через слой данных. Если так, то слою данных должно быть известно об одном из презентеров, т.е. должен содержать ссылку, хоть через интерфейс, как обзервер
public void setMainPresenter(Presenter presenter){
this.presenter = presenter;
}
public void setToolBarData(ToolBarData data){
this.presenter.toolBarDataChanged(data);
}
в презентере MainActivity:
public MainActivityPresenter(){
repository.setMainPresenter(this); //подписка на события
}
public void toolBarDataChanged(ToolBarData data){
//изменить данные в тулбаре
}
и в презентере фрагмента/контроллера: repository.setToolBarData(toolBarData);