将CrimeFragment中的数据传递给DatePickerFragment,然后再由DatePickerFragment返回数据到CrimeFragment。
1.发送数据
利用Fragment.setArguments()方法来实现发送数据。注意:setArguments()方法要在fragment创建后,未添加给activity之前调用。
2.获得数据
利用getArguments()方法来获取传送的数据。
3.返回数据
如果是activity的数据回传,可以利用startActivityForResult()方法,ActivityManager负责跟踪管理activity之间的关系,当子activity调用Activity.setResult()方法回传数据后,子activity被销毁,ActivityManager知道接收数据的是哪个activity。
然而对于fragment,也需要这种联系,可以借助目标fragment来实现。
数据是由CrimeFragment发送,DatePickerFragment接收,再由DatePickerFragment返回数据给CrimeFragment。所以可将CrimeFragment设置成DatePickerFragment的目标fragment。
目标fragment和请求码由FragmentManager负责跟踪管理,可以调用getTargetFragment()和getTargetRequestCode()方法来获取他们。
//设置目标fragment
datePickerFragment.setTargetFragment(crimeFragment, REQUEST_CODE);
接下来,需要在DatePickerFragment中调用CrimeFragment.onActivityResult()方法,来返回数据。同时在CrimeFragment中重写Fragment.onActivityResult()方法,来接收回传的数据。
class DatePickerFragment {
private void sendResult(int resultCode, Date date) {
if (getTargetFragment == null) return;
//将数据封装在intent中
Intent intent = new Intent();
intent.putExtra(DATE, date);
//通过调用getTargetFragment()方法来获取CrimeFragment的实例
//FragmentManager会调用CrimeFragment.onActivityResult()来返回数据
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}
}
class CrimeFragment {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_DATE) {
//获取数据
Date date = (Date) data.getExtra(DATE);
...
}
}
}
Activity获取返回的数据流程是,当子activity调用setResult()方法时,ActivityManager会自动地调用父Activity.onActivityResult()方法。而其后,当父activity接收到调用Activity.onActivityResult()方法的命令后,其FragmentManager会调用相应fragment的Fragment.onActivityResult()方法。
不同于Activity数据返回流程,相同activity的fragment间的数据返回,需要手动调用Fragment.onActivityResult()方法。