Для публикации информации от фрагмента к действию вы должны использовать шину событий для информирования о создании фрагмента (замена на обратные вызовы и созданный беспорядок).
Пример код для шины событий с RxJava является:
public class SampleEventsBus {
private static final String TAG = SampleEventsBus.class.getSimpleName();
private static final String TAG2 = SampleEventsBus.class.getCanonicalName();
public static final int ACTION_FRAGMENT_CREATED = 1;
public static final int ACTION_FRAGMENT_OTHER = 2;
private static SampleEventsBus mInstance;
public static SampleEventsBus getInstance() {
if (mInstance == null) {
mInstance = new SampleEventsBus();
}
return mInstance;
}
private SampleEventBus() {}
private PublishSubject<Integer> fragmentEventSubject = PublishSubject.create();
public Observable<Integer> getFragmentEventObservable() {
return fragmentEventSubject;
}
public void postFragmentAction(Integer actionId) {
fragmentEventSubject.onNext(actionId);
}
}
Тогда из вашего фрагмента вы можете позвонить:
SampleEventsBus.getInstance().postFragmentAction(SampleEventsBus.ACTION_FRAGMENT_CREATED);
из onAttach()
или onViewCreated()
или любого места вы предпочитаете.
Кроме того, в деятельности вам нужно будет поместить следующий код listet для вашего автобуса события:
SampleEventsBus .getInstance().getFragmentEventObservable().subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer actionId) {
if(actionId == SampleEventsBus.ACTION_FRAGMENT_CREATED) {
//do any required action
}
}
});
Для второй части, т.е.обновить фрагмент из деятельности, я не рекомендую использовать этот метод, так как это приведет к ненужной сложности, Вместо этого используйте «оригинальный способ», как:
- Создать метод в качестве фрагмента
updateView(Object obj)
- В
onNext()
, получить желаемый фрагмент, как SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
- вызова
fragment.updateView(obj);
Надежда это помогает.
Почему вы хотите, чтобы операция вызывала функцию фрагмента? Что именно вы делаете? –
его просто используемый случай, когда я в основном выполняю сетевой вызов в действии, и когда я закончил, я рисую полилинию в фрагменте карты, который является отдельным фрагментом, замененным в рамках frameelayout активности, но проблема - это жизненный цикл, я не знаю, когда будет фрагмент get created, поэтому я не получаю нулевой контекст во фрагменте –
Вы можете использовать onAttach для получения ссылки на Контекст/Активность и вызывать любой метод, или вы можете полностью выполнить сетевой запрос во Фрагменте. Я не уверен в том, что Rx-материал, хотя –