私にはアクティビティがあり、そのレイアウトにはFrameLayoutが含まれています。 framelayoutをフラグメントコンテナーとして使用します。 FragmentManagerトランザクションを使用して、FrameLayoutのフラグメントを置き換えます。
フラグメントのonCreateメソッドの1つで、フラグメントをEventBusを使用して登録します。
@Override
public void onCreate(){
EventBus.getDefault().register(this);
// other initialization code
}
フラグメントのレイアウトにはGridViewがあります。 gridViewのアイテムがクリックされるたびに、EventBusにイベントを投稿します
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.fragment_category, container, false);
gridView = (GridView) rootView.findViewById(R.id.categry_grid_view);
gridAdapter = new CustomGridAdapter(getActivity());
gridView.setAdapter(gridAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Category clickedCategory = gridAdapter.getItem(position);
EventBus.getDefault().post(new MyEvent());
}
});
このイベントのイベントハンドラーメソッドは同じフラグメントにあります。つまり、フラグメントには次のメソッドがあります。
public void onEvent(MyEvent e){
//some code;
}
これは、アプリがフォーカスを失って非アクティブになるまで正常に機能します(ホームボタンまたは画面ロックを押したため)。アプリを再度アクティブにすると、イベントのイベントハンドラーが呼び出されません。 LogCatで次のステートメントを確認できます
com.example.app D/Event﹕ No subscribers registered for event class com.example.app.MyEvent
com.example.app D/Event﹕ No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent
誰かが私がここで間違っていることを教えてもらえますか?
編集1:
画面ロックまたはホームボタンが押されたためにアプリケーションが非アクティブになると、フラグメントのonStopメソッドが呼び出されます。 EventBusからフラグメントを登録解除するコードは、onStopメソッドにあります。アプリケーションが再びアクティブになると、フラグメントのonStartメソッドとonResumeメソッドが呼び出されます。そこで、コードを移動してフラグメントをonStartメソッドのEventBusに登録しました。
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
アプリケーションがアクティブになったときにonStartメソッドが実際に呼び出されるかどうかを確認するために、いくつかのログステートメントを配置しました。呼ばれている。それでも、アプリケーションが非アクティブになり、再びアクティブになると、物事は機能しません。
編集2このフラグメントを含むアクティビティもEventBusにサブスクライブすることを忘れていました。アクティビティをEventBusに登録するコードはそのonCreateメソッドにあり、アクティビティの登録を解除するコードはそのonStopメソッドにあります。
このフラグメントを含むアクティビティは、EventBusにもサブスクライブしました。 EventBusにアクティビティを登録するコードはonCreateメソッドにあり、アクティビティの登録を解除するコードはonStopメソッドにありました。
アプリケーションが非アクティブになったとき(画面ロックまたはホームボタンを押したため)、含まれているアクティビティのonStopメソッドが呼び出され、EventBusから登録解除されていました。何らかの理由で、それを含むフラグメントも登録解除されました(理由はわかりません)。 EventBusを使用したフラグメントの再登録は機能しませんでした。
この問題を解決するには、コードを移動して、含まれているアクティビティをonDestroyメソッドに登録解除します。
なぜこれが機能するのかはまだわかりませんが、少なくとも現在の問題は解決します。誰かが説明やより良い洞察を持っている場合は、コメントするか、答えを投稿してください。
私にとって問題は何か他のものだったので、まだコミットされていないフラグメントに投稿しようとしました。質問に記載されているのと同じ2つのエラーが表示されます。
そのため、投稿を呼び出す前にgetSupportFragmentManager().executePendingTransactions();
を実行し、それによって問題が解決しました。