Ответ 1
Для публикации информации от фрагмента к действию вы должны использовать шину событий для информирования о создании фрагмента (замена на обратные вызовы и созданный беспорядок).
Пример кода для шины событий с 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()
или в любом месте, которое вы предпочитаете.
Кроме того, в действии вам нужно будет поместить следующий код в список для вашей шины событий:
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);
Надеюсь, что это поможет.