由同一个Activity托管的两个fragment之间的通信

引言

  子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);

你可能感兴趣的:(由同一个Activity托管的两个fragment之间的通信)