为了将信息从片段发布到活动,您应该使用事件总线来通知活动有关片段创建(替换回调和它们创建的混乱)。
使用 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
}
}
});
对于第二部分,即从活动更新片段,我不建议使用这种方法,因为它会导致不必要的复杂性,而是使用“原始方式”作为:
- 在 Fragment 中创建一个方法为
updateView(Object obj)
- 在
onNext()
中,获得所需的片段为SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
- 称呼
fragment.updateView(obj);
希望这可以帮助。