Skip to content

4. Page

gaowei edited this page Mar 13, 2022 · 4 revisions

该模块的目的是对Fragment展示的扩展,定义好ViewGroup宿主,按照3种不同的情况来展示Fragment;未来也会增加更多的场景

RouterPageSingle

典型应用场景

  • Fragment容器中只同时存在一个Fragment实例
  • 不耦合的前提下对Fragment进行切换和控制

定义Fragment

@Router(path = "/fragment/first/.*")
public class MessageFragment extends Fragment {
}

绑定Fragment容器

RouterPageSingle pageRouter = 
    new RouterPageSingle(getSupportFragmentManager(), containerId);

// 注册监听,使得调用方可以控制
DRouter.register(
        ServiceKey.build(IPageRouter.class)
            .setAlias("router_page_single")     // 设置一个别名,避免重复
            .setLifecycleOwner(this),           // 如果不绑定生命周期,需要手动解监听
        pageRouter);

调用方

// 使用正常的ServiceLoader方式获取
IPageRouter pageRouter = DRouter.build(IPageRouter.class)
    .setAlias("router_page_single")
    .getService();

// 注册观察者
pageRouter.addPageObserver(new IPageRouter.IPageObserver() {
    @Override
    public void onPageChange(@NonNull IPageBean from, @NonNull IPageBean to) {
    
    }
}, this);

// 切换页面,可以实现自己的IPageBean
router.showPage(new IPageBean.DefPageBean("/fragment/first/3"));
router.popPage();

RouterPageStack

典型应用场景

  • Fragment容器中以堆栈的形式存在多个Fragment实例
  • 不耦合的前提下对Fragment进行切换和控制
  • 使用方式基本类似RouterPageSingle

绑定Fragment容器

RouterPageStack pageRouter = 
        new RouterPageStack(getSupportFragmentManager(), containerId);

RouterPageViewPager

典型应用场景

  • 使用ViewPager承载Fragment
  • 不耦合的前提下对Fragment进行切换和控制
  • 使用方式基本类似RouterPageSingle

绑定Fragment容器

RouterPageViewPager pageRouter = 
    new RouterPageViewPager(getSupportFragmentManager(), viewPager);
// 添加数据
pageRouter.update(
        new IPageBean.DefPageBean("/fragment/first/1"),
        new IPageBean.DefPageBean("/fragment/first/2"),
        new IPageBean.DefPageBean("/fragment/first/3"));

PS

这部分的功能DRouter正在继续努力开发和迭代,会去支持更多的能力和场景