引言
子activity将数据回传到父activity可以使用setResult(int resultCode, Intent intent)
,然后ActivityManager会自动调用父activity的onResultActivity
,再在 onResultActivity
中取出相关数据就能够实现父子activity之间的数据回传。但fragment返回结果的处理方式有所不同,在《Android权威编程指南》
中有一句话:
fragment能够从activity中接受返回结果,但其自身无法持有返回结果。只有activity拥有返回结果。因此,尽管Fragment有自己的startActivityForResult(...)方法和 onActivity(...)方法,但是没有setResult(...)方法。
所以两个activity的fragment返回数据的方法是getActivity()setResult(int resultCode, Intent data)
,但由同一个activity托管的两个fragment之间似乎不能这样返回数据,因为调用setResult(...)
之后当前activity会被销毁。
1.父activity如何获取子activity返回的数据
当子activity调用setResult(...)
并被销毁后,ActivityManager会自动调用父activity的Activity .onActivity(...)
方法,而父类接收到Activity.onActivity(...)
方法的调用指令后,其FragmentManager会调用对应fragment的Fragment.onActivity(...)方法
,因此,处理由同一activity托管的两个fragment间的数据返回时,可借用Fragment.onActivityResult(...)方法。也就是在其中一个fragment直接调用另外一个fragment的Fragment.onActivityResult(...)
。那么接下来就要解决如何获取被传入数据的fragment的引用。
2.调用方fragmentA如何获取由同一个activity托管的被调用方fragmentB的引用
通过startActivityForResult(...)
建立的父子activity关系可以使得子activity被销毁后,ActivityManager知道接受数据的是哪个activity。因此可以通过建立由同一个activity托管的两个fragment之间的关联,使得这两个fragment被销毁重建后仍保留这种关联,以保证能在调用方fragmentA中获得被调用方fragmentB的引用。建立这种关联的方法是:
public void setTargetFragment(Fragment targetFragment, int requestCode)
3. 如何获取目标targetFragment并实现数据返回
建立关联后,目标fragment和请求代码由FragmentManager负责跟踪,可以在调用方fragment中通过getTargetFragment()方法和getTargetReuqestCode()方法
分别获取目标fragment的引用和请求代码,并在通过引用直接执行以下代码即可实现数据返回。
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);