agment.onDestroy: ");
33 super.onDestroy();
34 EventBus.getDefault().unregister(this);
35 }
36 @Subscribe(threadMode = ThreadMode.MAIN)
37 public void handlerEvent(FragmentEvent event){
38 Log.i(TAG, "AFragment.handlerFragmentEvent: event="+event);
39 Log.i(TAG, "AFragment.handlerEvent: titleTv="+titleTV);
40 titleTV.setText(event.toString());
41 }
1 BFragment.class
2
3 private TextView titleTV;
4 @Override
5 public View onCreateView(LayoutInflater inflater, ViewGroup container,
6 Bundle savedInstanceState) {
7 // Inflate the layout for this fragment
8 return inflater.inflate(R.layout.fragment_b, container, false);
9 }
10
11 @Override
12 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
13 super.onViewCreated(view, savedInstanceState);
14 titleTV= (TextView) view.findViewById(R.id.tv_fb_title);
15 titleTV.setOnClickListener(new View.OnClickListener() {
16 @Override
17 public void onClick(View v) {
18 Log.i(TAG, "BFragment.onClick: postEvent");
19 EventBus.getDefault().post(new FragmentEvent(23));
20 }
21 });
22 }
在Activity中使用FragmentManager进行切换布局,有两种方式,一是布局替换,即FragmentManager.replace()相关方法,第二种是布局显隐,即FragmentManager.hide()和FragmentManager.show()等相关方法。原始代码中使用replace()直接替换Fragment,这种方式导致每次替换的Fragment都是从onAttach()开始重新执行,所以之前在BFragment中发送event时,当前的AFragment还没有创建,也就不会执行对event的处理操作。这样就有两种解决方案。
方案一:使用EventBus的postSticky()方法延缓发送event,而在AFragment中接收event时注解为sticky=true,默认为false。所以更新代码如下
1 AFragment.class
2 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
3 public void handlerEvent(FragmentEvent event){
4 Log.i(TAG, "AFragment.handlerFragmentEvent: event="+event);
5 Log.i(TAG, "AFragment.handlerEvent: titleTv="+titleTV);
6 titleTV.setText(event.toString());
7 }
1 BFragment.class
2 @Override
3 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
4 super.onViewCreated(view, savedInstanceState);
5 titleTV= (TextView) view.findViewById(R.id.tv_fb_title);
6 titleTV.setOnClickListener(new View.OnClickListener() {
7 @Override
8 public void onClick(View v) {
9 Log.i(TAG, "BFragment.onClick: postEvent");
10 EventBus.getDefault().postSticky(new FragmentEvent(23));
11 }
12 });
13 }
使用方案一走日志发现在AFragment中的确已经正常接收到了event并对其进行了处理,但是处理event之后又从onCreateView()开始执行更新视图等一系列操作,导致event更新的视图被更新之后的视图所覆盖,处理这个问题的话,只要在handlerEvent中先不着急更新view,而是新创建一个全局event来存储当前的event,在onViewCreated()中判断全局event如果非空就更新数据。方案一最终修改代码如下:
1 AFragment.class
2 private FragmentEvent mEvent;
3 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
4 public void handlerEvent(FragmentEvent event){
5 Log.i(TAG, "AFragment.handlerFragmentEvent: event="+event);
6 Log.i(TAG, "AFragment.handlerEvent: titleTv="+titleTV);
7 // titleTV.setText(event.toString());
8 mEvent=event;
9 }
10 @Override
11 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12 Log.i(TAG, "AFragment.onViewCreated: ");
13 super.onViewCreated(view, savedInstanceState);
14 titleTV=(TextView)view.findViewById(R.id.tv_fa_title);
15 if(mEvent!=null){
16 titleTV.setText(mEvent.toString());
17 }
18 }
方案二:使用FragmentManager的显隐方法