Skip to content
兮尘 edited this page Aug 29, 2021 · 7 revisions

前言

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

如果你想要和正常跳转 Activity 一样跳转 Fragment, 不妨看看 单Activity多Fragment

使用

标记你的 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;
    }

}

Kotlin 的写法要注意, 下面展示了 Kotlin 的标记类和方法的代码. 两个可以同时存在, 名字不同即可

特别注意:@FragmentAnno 在 Kotlin 标记在方法上的时候, 不能使用 @JvmStatic 注解

@FragmentAnno(value = ["component2.test1Fragment1"])
class Test1Fragment : Fragment() {
    companion object {
      	// @JvmStatic 注解驱动器会报错, 提示名字已经存在. 请不要使用这个 @JvmStatic 注解
        @FragmentAnno("component2.test1Fragment2")
        fun newInstance(bundle: Bundle): Test1Fragment {
            val f = Test1Fragment()
            f.arguments = bundle
            return f
        }
    }
}

获取目标 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 -> {
            // 处理错误
        });
Clone this wiki locally