Fragment间的数据传递

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参数。
  1. 将日期对象保存在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的构造方法。

  1. 由于使用的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);

  1. 传递数据给目标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);
  

   }
  1. 接下来我们就 可以来验证一下是否可以了?当点击了对话框中的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();
   }
  1. 从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();

   }

结果展示:

Fragment间的数据传递_第1张图片

Fragment间的数据传递_第2张图片
Fragment间的数据传递_第3张图片

你可能感兴趣的:(Fragment间的数据传递)