Skip to content

跳转 Fragment

xiaojinzi123 edited this page Oct 11, 2019 · 4 revisions

前言

其实这块功能不应该出现的, 但是我看大部分人很喜欢这么使用去获取 Fragment, 而通过 SPI 的方式去获取 Fragment 确实有点麻烦, 所以这里对获取 Fragment 的方式做了一个简化, 当然你还是可以通过 SPI 去获取. 但是这里提供了一种更为简单的获取方式, 我这里和大家一样把它称为 路由 Fragment 但是大家要注意, 这里的 路由 Fragment 其实就是获取 Fragment 的一种方式, 包括 ARouter 也是一样.

使用

标记你的 Fragment

使用 @FragmentAnno 去标记你的 Fragment.

@FragmentAnno 有两个属性:

  • value() 表示 Fragment 的唯一标记
  • singleTon() 表示这个 Fragment 是否是单例的, 默认是 false

比如下面这样:

@FragmentAnno("test1Fragment")
public class Test1Fragment extends Fragment {
       // xxxxxxx
}

框架也支持 Android 默认推荐的创建 Fragment 的方式(静态的 newInstance 方法):

public class Test2Fragment extends Fragment {

    @FragmentAnno("test2Fragment")
    public static Test2Fragment newInstance(@NonNull Bundle bundle) {
        Bundle args = new Bundle();
        args.putAll(bundle);
        Test2Fragment fragment = new Test2Fragment();
        fragment.setArguments(args);
        return fragment;
    }

}

获取目标 Fragment

// 注意这个地方可能返回 null 的, 可能有两种情况:
// 1. 唯一标记你填写错了, 当然这个可以 debug 的时候就可以发现, 没啥问题
// 2. 对应的模块压根没有加载, 这时候你虽然参数是对的, 但是还是获取不到的
Fragment fragment = Router.with("testFragment").navigate();
// 你拿到这个 Fragment 就可以为所欲为了

如果你依赖的是 rx 版本的, 那么你可以如下使用

RxRouter.with("test1Fragment")
        .call()
        .subscribe(fragment -> {
            // 拿到 Fragment
        });

产生的错误框架自动帮您忽略了, 如果你想要处理错误, 订阅的时候, 传入错误处理的回调即可, 比如:

Dispose dispose = RxRouter.with("test1Fragment")
        .call()
        .subscribe(fragment -> {
            // 拿到 Fragment
        }, throwable -> {
            // 处理错误
        });
You can’t perform that action at this time.