设为首页 加入收藏

TOP

使用FragmentManager对Fragment的生命周期影响(二)
2017-10-13 10:37:08 】 浏览:8159
Tags:使用 FragmentManager Fragment 生命 周期 影响
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的显隐方法

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Visual Studio Emulator for Andr.. 下一篇Android彻底组件化方案实践

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目