Fragment间的数据传递
主要记录一下如何实现同一个Activity托管的两个Fragment之间日期的数据传递。
- 首先在Crime类中有Date的变量
public class Crime {
private Date mDate;
public Crime(){
mDate= new Date();
}
public Date getDate() {
return mDate;
}
public void setDate(Date date) {
mDate = date;
}
}
- 传递crime的日期给Fragment,需新建一个newInstance(Date)方法,然后将Date作为argument附件给Fragment。为了返回新的日期给Fragment并更新模型层以及对应的视图,需要将日期打包为extra并附加到Intent上,然后调用Fragment.onActivityResult(...)的方法,并传入准备好的Intent参数。
- 将日期对象保存在DatePickerFragment的argument bundle中,这样DatePickerFragment可以直接获取日期。
private static final String ARG_DATE = "date";
private DatePicker mDatePicker;
public static DatePickerFragment newInstance(Date date) {
Bundle args = new Bundle();
args.putSerializable(ARG_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
注意要在CrimeFragment中使用DatePickerFragment.newInstance(Date)方法替换DatePickerFragment的构造方法。
- 由于使用的Date是时间戳,无法直接提供整数,所以我们必须首先创建一个Canlendar对象,然后使用Date对象来配置它,再从Canlendar中取出所需信息。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) { //创建了AlertDialog的实例
//CrimeFragment向DatePickerFragment传递日期
Date date = (Date) getArguments().getSerializable(ARG_DATE);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
View v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date, null);
mDatePicker = (DatePicker) v.findViewById(R.id.dialog_date_picker);
mDatePicker.init(year, month, day, null);
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();
}
返回数据给目标fragment
public void setTargetFragment(Fragment fragment,int requestionCode);
传递数据给目标fragment 建立了目标fragment与DatePickerFragment之间的联系之后,需要将数据传递给目标fragment。回传日期将作为extra附件给Intent。
发送Intent信息给目标Fragment
public static final String EXTRA_DATE ="com.example.criminalintent.date";
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);
}
- 接下来我们就 可以来验证一下是否可以了?当点击了对话框中的positive按钮后,是否将日期传递给了目标fragment。
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();
}
- 从extra中获取日期数据,设置对应的Crime的记录日期,然后刷新日期按钮的显示。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_DATE) {
Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mCrime.setDate(date);
mDateButton.setText(mCrime.getDate().toString());
//updateDate();
}
结果展示: