Skip to content

8. 使用场景- loadMultiRootFragment的使用 & ViewPager

薛瑄 edited this page Mar 3, 2020 · 1 revision

同级未加入回退栈的Fragments

ViewPagerFragmentTabHost、及库提供的loadMultiRootFragment()均属于这种情况

记住一个原则: 避免在未加入回退栈的层级内去start()其它Fragment, 比如ViewPagerloadMultiRootFragment()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的优化使用