对话框Fragment与其托管Fragment之间的数据传递

  将CrimeFragment中的数据传递给DatePickerFragment,然后再由DatePickerFragment返回数据到CrimeFragment。

1.发送数据

  利用Fragment.setArguments()方法来实现发送数据。注意:setArguments()方法要在fragment创建后,未添加给activity之前调用。

2.获得数据

  利用getArguments()方法来获取传送的数据。

3.返回数据

  如果是activity的数据回传,可以利用startActivityForResult()方法,ActivityManager负责跟踪管理activity之间的关系,当子activity调用Activity.setResult()方法回传数据后,子activity被销毁,ActivityManager知道接收数据的是哪个activity

  然而对于fragment,也需要这种联系,可以借助目标fragment来实现。

  数据是由CrimeFragment发送,DatePickerFragment接收,再由DatePickerFragment返回数据给CrimeFragment。所以可将CrimeFragment设置成DatePickerFragment的目标fragment

  目标fragment请求码FragmentManager负责跟踪管理,可以调用getTargetFragment()getTargetRequestCode()方法来获取他们。

//设置目标fragment
datePickerFragment.setTargetFragment(crimeFragment, REQUEST_CODE);

  接下来,需要在DatePickerFragment中调用CrimeFragment.onActivityResult()方法,来返回数据。同时在CrimeFragment中重写Fragment.onActivityResult()方法,来接收回传的数据。

class DatePickerFragment {
    private void sendResult(int resultCode, Date date) {
          if (getTargetFragment == null) return;
          //将数据封装在intent中
          Intent intent = new Intent();
          intent.putExtra(DATE, date);
          //通过调用getTargetFragment()方法来获取CrimeFragment的实例
          //FragmentManager会调用CrimeFragment.onActivityResult()来返回数据
          getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
    }
}
class CrimeFragment {
      @Override
        public  void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode != Activity.RESULT_OK) {
                    return;
                }
            if (requestCode == REQUEST_DATE) {
                    //获取数据
                    Date date = (Date) data.getExtra(DATE);
                    ...
                }
        }
}

  Activity获取返回的数据流程是,当子activity调用setResult()方法时,ActivityManager会自动地调用父Activity.onActivityResult()方法。而其后,当父activity接收到调用Activity.onActivityResult()方法的命令后,其FragmentManager会调用相应fragment的Fragment.onActivityResult()方法

  不同于Activity数据返回流程,相同activity的fragment间的数据返回,需要手动调用Fragment.onActivityResult()方法

你可能感兴趣的:(对话框Fragment与其托管Fragment之间的数据传递)