背景:
等同於前文中的利用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(); } }