-
Notifications
You must be signed in to change notification settings - Fork 208
跳转 Fragment
兮尘 edited this page Aug 29, 2021
·
7 revisions
其实这块功能不应该出现的, 但是我看大部分人很喜欢这么使用去获取 Fragment
, 而通过 SPI
的方式去获取 Fragment
确实有点麻烦, 所以这里对获取 Fragment
的方式做了一个简化, 当然你还是可以通过 SPI
去获取. 但是这里提供了一种更为简单的获取方式, 我这里和大家一样把它称为 路由 Fragment
但是大家要注意, 这里的 路由 Fragment
其实就是获取 Fragment
的一种方式, 包括 ARouter
也是一样.
如果你想要和正常跳转 Activity 一样跳转 Fragment, 不妨看看 单Activity多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
}
}
}
// 注意这个地方可能返回 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 -> {
// 处理错误
});