Passing Data Between Two Fragments hosted by same activity
背景:
等同于前文中的利用Fragment argument
1) 将date信息从CrimeFragment传送到DatePickerFragment
Step1: 在DatePickerFragment中添加newInstance方法
public static DatePickerFragment newInstance(Date date) { Bundle args = new Bundle(); args.putSerializable(ARG_DATE, date); DatePickerFragment fragment = new DatePickerFragment(); fragment.setArguments(args); return fragment; }
Step2: 在CrimeFragment中调用上述方法
mDateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate()); //建立CrimeFragment与DatePickerFragment之间的关系。以便CrimeFragment接收传回的date信息 dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE); dialog.show(manager, DIALOG_DATE); } });
Step3: 在DatePickerFragment中检索date信息
public Dialog onCreateDialog(Bundle savedInstanceState) {
Date date=(Date)getArguments().getSerializable(ARG_DATE);
......
}
2) 将date信息从DatePickerFragment传送回CrimeFragment
1) 利用target建立CrimeFragment与DatePickerFragment之间的关系
mDateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate()); //建立CrimeFragment与DatePickerFragment之间的关系。以便CrimeFragment接收传回的date信息 dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE); dialog.show(manager, DIALOG_DATE); } });
2)在DatePickerFragment利用建立的关系调用target fragment的方法以返回信息
private void sendResult(int resultCode, Date date) { if (getTargetFragment() == null) { return; } Intent intent = new Intent(); intent.putExtra(EXTRA_DATE, date); getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent); }
3)用户点击OK键之后调用sendResult方法
return new AlertDialog.Builder(getActivity()) .setView(v) .setTitle(R.string.date_picker_title) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int year = mDatePicker.getYear(); int month = mDatePicker.getMonth(); int day = mDatePicker.getDayOfMonth(); Date date = new GregorianCalendar(year, month, day).getTime(); sendResult(Activity.RESULT_OK, date); } }) .create();
4)在CrimeFragment中调用onActivityResult方法来获取返回的信息
public void onActivityResult(int requestCode, int resultCode, Intent data) { //用于接收关联的fragment传送回的消息。 //此fragment所属的activity在调用本身的onActivityResult时,activity的FragmentManager将调用这里的方法 if (resultCode != Activity.RESULT_OK) { return; } if (requestCode == REQUEST_DATE) { Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE); mCrime.setDate(date); updateDate(); } }