设为首页 加入收藏

TOP

使用FragmentManager对Fragment的生命周期影响(三)
2017-10-13 10:37:08 】 浏览:8156
Tags:使用 FragmentManager Fragment 生命 周期 影响
而不是替换方法切换Fragment,使用hide()和show(),必须要先调用add()把Fragment添加到FragmentManager中,而此时切换两个Fragment,并不会重新执行onCreate()--onResume()等一系列流程,只有在Activity中显示调用Fragment的setUserVisibleHint()方法表示当前Fragment的显隐,说明Fragment已经绑定到Activity中,其生命周期只有在Activity的onResume()之中保存。方案二修改后的代码如下:

 1 SecondActivity.class
 2     @Override
 3     protected void onCreate(Bundle savedInstanceState) {
 4         super.onCreate(savedInstanceState);
 5         EventBus.getDefault().register(this);
 6         setContentView(R.layout.activity_second);
 7         but1= (Button) findViewById(R.id.but1);
 8         but2= (Button) findViewById(R.id.but2);
 9         but1.setOnClickListener(this);
10         but2.setOnClickListener(this);
11         aFragment=AFragment.newInstance(null, null);
12         bFragment=BFragment.newInstance(null, null);
13         changeFragment(aFragment);
14         addFragmentTransaction(aFragment);
15         addFragmentTransaction(bFragment);
16 
17     }
18     private void addFragmentTransaction(Fragment fragment) {
19         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
20         transaction.add(R.id.fl_container, fragment);
21         transaction.commit();
22     }
23     private void changeFragment(Fragment f){
24         changeFragment2(f);
25     }
26 
27     private void changeFragment2(Fragment f){
28         Log.i(TAG, "SecondActivity.changeFragment2: f="+f.getClass().getName());
29         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
30         if(f.getClass().getName().equals(aFragment.getClass().getName())){
31             transaction.hide(bFragment);
32             transaction.show(aFragment);
33             bFragment.setUserVisibleHint(false);
34             aFragment.setUserVisibleHint(true);
35         }else {
36             transaction.hide(aFragment);
37             transaction.show(bFragment);
38             aFragment.setUserVisibleHint(false);
39             bFragment.setUserVisibleHint(true);
40         }
41         transaction.commit();
42     }

以上两种解决方案各有优缺点,总体来说,如果想每次Fragment显示时都要重新更新View,使用方案一的方式更好,但是方案一如果多次切换,由于之前的Fragment已经与当前Activity解除绑定,所以没有了引用的地方,但是仍然存在内存中,如果系统释放内存不及时,就会有内存泄漏的隐患;同样对于方案二来说,每次切换不会重新更新界面,所以如果想在显隐时做些操作,只能显示调用Fragment的setUserVisibleHint()方法并重写该方法以做操作。说到方案二的这种形式,和ViewPager的相关切换方式有些相同,可参考。

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目