web-dev-qa-db-ja.com

フラグメントのイベントバス

1つのアクティビティ(DemoActivity.Java)と2つのフラグメント(FragmentOne.JavaおよびFragmentTwo.Java)を作成しました。

ThisEventBus.getDefault().register(this);のようにアクティビティにEventBusを登録しました

アクティビティで1つのSuscriberメソッドを作成しました。

_@Subscriber
public void abc(String str) {
    Log.i(TAG,"MainActivity Called !!");
}
_

次に、ボタンをクリックしてFragmentTwo.Javaからイベントを投稿しますEventBus.getDefault().post("");

このシナリオは私にとってはうまくいきます。しかし、FragmentOne.Javaで同じサブスクライバーメソッドを作成すると、機能しません。どうして?

14
sanil

あなたの質問から、問題を引き起こしている2つのことがあるかもしれません:

  1. EventBusクラスの場合とは異なり、FragmentOneDemoActivityクラスに登録していない可能性があります。
  2. EventBusFragmentOneを登録している場合は、FragmentOneフラグメントクラスが生きていて、FragmentTwoクラス。

編集する

コメントからわかるように、EventBusEventBus.getDefault().register(getActivity())として登録しました。これにより、アクティビティのみが登録されます。 Fragmentを登録するには、EventBus.getDefault().register(this)メソッドでFragment.onCreate()を使用します。

12
Nitin Joshi

フラグメントには Sticky Events を使用します。フラグメントが複数のオフセットをロードするためです。

Eventbusを登録および登録解除します。

_ @Override
public void onStart() {
    Log.d(TAG, "Register ");
    EventBus.getDefault().register(this);
    super.onStart();
}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "Unregister");
    EventBus.getDefault().unregister(this);
}
_

OnChildChange.class post event with .postSticky()

_EventBus.getDefault().postSticky(new OnChildChange(position));
_

_sticky = true_でEventBusを購読:

_@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onCategoryChangeEvent(OnChildChange event){
    // get the event and remove drom sticky
    OnChildChange stickyEvent = EventBus.getDefault().removeStickyEvent(OnChildChange.class);

    if(stickyEvent != null) {
        // apply your logic or call methods 
    }

}
_
5