美文网首页
对话框Fragment与其托管Fragment之间的数据传递

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

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-03-01 11:32 被阅读0次

      将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之间的数据传递

          本文链接:https://www.haomeiwen.com/subject/ckgruqtx.html