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