fragment看似简单,其实也有2种管理模式,一种是当每次切换时启动一个fragment,一种是装载第一个fragment时其实所有fragment已经全都启动了。
前者
首先是全局变量fragmentManager,fragmentTransaction的声明
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
然后首次进入时装载首页fragment
Fragment fragment_index = new IndexFragment();
fragmentTransaction.add(R.id.fl_main, fragment_index, "tag");
fragmentTransaction.commit();
然后每次切换不同的fragment,使用replace方法来装载
fragment_2 = new Fragment2();
fragmentTransaction.replace(R.id.fl_main, fragment_2, "tag");
fragmentTransaction.commit();
这样就是每次装载自己的fragment,按按钮时会刷新
后者
在管理activity将所有fragment启动
fragmentTransaction.add(fragment_id, fragment_1, "fragment_1");
fragmentTransaction.add(fragment_id, fragment_2, "fragment_2");
fragmentTransaction.add(fragment_id, fragment_3, "fragment_3");
fragmentTransaction.show(fragment_1);
fragmentTransaction.hide(fragment_2);
fragmentTransaction.hide(fragment_3);
fragmentTransaction.commit();
然后在按按钮时,对fragment进行show或hide
但是2者其实还有一个区别。
如果是分别加载fragment,那么所有的tag全部设置成一样的,可以在
savedInstanceState != null
的情况下,轻松找到最前端使用中的fragment,进行快速装载
if (savedInstanceState != null) {
Fragment oldfragment = fragmentManager.findFragmentByTag("tag");
fragmentTransaction.add(R.id.fl_main, oldfragment, "tag");
}
如果是一次性加载fragment,那么每个fragment都要设置不同的tag,因为已经全部加载过,所以savedInstanceState != null的情况下,要将所有fragment分别找到
if (savedInstanceState != null) {
fragment_1 = fragmentManager.findFragmentByTag("fragment_1");
fragment_2 = fragmentManager.findFragmentByTag("fragment_2");
fragment_3 = fragmentManager.findFragmentByTag("fragment_3");
}