forked from YoKeyword/Fragmentation
-
Notifications
You must be signed in to change notification settings - Fork 54
8. 使用场景- loadMultiRootFragment的使用 & ViewPager
薛瑄 edited this page Mar 3, 2020
·
1 revision
ViewPager
、FragmentTabHost
、及库提供的loadMultiRootFragment()
均属于这种情况
记住一个原则: 避免在未加入回退栈的层级内去start()
其它Fragment, 比如ViewPager
、loadMultiRootFragment()
、FragmentTabHost
内部的Fragment不可以直接start
,这种情况下其内的栈应该保持干净,如果想启动其它Fragment,应该由它们的父Fragment或子Fragment去start
- 装载TabFragments
装载同级Fragment,我们需要用到loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... fragments)
,其中参数分别对应容器id,需要show的Fragment下标位置,SupportFragment的数组。
public class MainActivity extends SupportActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multi_activity_main);
if (findFragment(MultiFirstFragment.class) == null) {
mFragments[FIRST] = MultiFirstFragment.newInstance();
mFragments[SECOND] = MultiSecondFragment.newInstance();
mFragments[THIRD] = MultiThirdFragment.newInstance();
loadMultipleRootFragment(R.id.fl_container, FIRST,
mFragments[FIRST],
mFragments[SECOND],
mFragments[THIRD]
} else {
// 这里库已经做了Fragment恢复工作,不需要额外的处理
// 这里我们需要拿到mFragments的引用,用下面的方法查找更方便些,也可以通过getSupportFragmentManager.getFragments()自行进行判断查找(效率更高些)
mFragments[FIRST] = findFragment(MultiFirstFragment.class);
mFragments[SECOND] = findFragment(MultiSecondFragment.class);
mFragments[THIRD] = findFragment(MultiThirdFragment.class);
}
}
}
- 切换TabFragment
// 第一个参数为需要show的Fragment,第二个为需要hide的Fragment
showHideFragment(needShowFragment, needHideFragment);
- 优化:懒加载
通常我们会使用懒加载来兼顾性能和优化内存,详情查看使用场景- Fragment的优化使用