今年年初启动的项目中计划使用JetPack
的Navigation
框架,于是如何在Fragment之间传递数据就成为了一个新的问题。
因为Fragment
中并没有像Activity
中setResult
和onActivityResult
这样的API,而且Navigation
对此也是毫无支持。
虽然在最新的Fragment-1.3.0-alpha08
中有新加入的API,但是你看到alpha
几个字符后,还是算了吧。
于是自己琢磨出了一套方法,相比官方推荐的一系列方法中,这套方法拥有以下优势:
- 使用类型签名的方式进行匹配,不需要传递String类型的Key
- 直接传递任意类型的对象,不需要实现
Serializable
或Parcelable
接口 - 无需声明接口或ViewModel、LiveData等
1.在你的android
工程的根目录下的build.gradle
文件中适当的位置添加以下代码:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2.在你的模块下的build.gradle
文件中的适当位置添加以下代码:
dependencies {
implementation 'com.gitee.numeron:mortar:0.1.0'
}
1.在启用Navigation
的Activity
中的onCreate
方法中、setContentView
之前,调用以下方法:
mortarEnabled()
1.在要接收数据的AFragment
中使用onResult
方法:
onResult<List<User>> { resultCode: Int, list: List<User>? ->
if(resultCode == RESULT_OK) {
if(!list.isNullOrEmpty()) {
//TODO()
}
} else {
//TODO()
}
}
2.在要传递数据的BFragment
中使用setResult
方法:
val userList: List<User> = ...
setResult(RESULT_OK, userList)
3.当从BFragment
返回到AFragment
时,之前通过onResult
方法设置的Lambda
回调就会运行。
- 注:
onResult
和setResult
传递的参数的类型必需一致,MutableList和List是不一样的,当其中一个为MutableList时,应该将类型声明为具体的List类型。