由于从托管Fragment 的Activity中之间使用Intent会破坏Fragment 的封装性 于是我们可以直接将数据存储在Fragment内部 这个内部的空间就是 agument bundle;
在使用的时候我们首先建立一个Bundle对象 然后用 putSerializable 方法将传到的数据存入其中 一个个值为KEY 然后新建一个Fragment 将 Bundle存入 其中 在返回给Activity 这个步骤需要在fragment创建后添加给Activity之前完成。
public static CrimeFragment newInstance(UUID crimeId) { Bundle args = new Bundle(); args.putSerializable(ARG_CRIME_ID,crimeId); CrimeFragment fragment = new CrimeFragment(); fragment.setArguments(args); return fragment; }然后在Activity添加完成后再获取该数据 就在该Fragment中
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);然后就可以用返回的数据完成操作了
首先看看原生API ,其实就是在需要数据的fragment 看为目标fragment 然后 调用 getTargeFragment 和 settTargeFragment 来获取其中的数据;
首先比方我们要从Fragment之间获取数据 于是
public static DatePickerFragment newInstance(Date date) { Bundle args = new Bundle(); args.putSerializable(ARG_DATE,date); DatePickerFragment datePickerFragment = new DatePickerFragment(); datePickerFragment.setArguments(args); return datePickerFragment; } 先将数据放入fragment然后在目标Activity 中建立set
fragment.setTargetFragment(CrimeFragment.this,REQUEST_DATE);然后在传入数据的fragment中这样设置 得到需要的date数据时候调用 下面的方法
public void sendResult(int resultCode,Date date) { if(getTargetFragment() == null) { return; } Intent intent = new Intent(); intent.putExtra(EXTRA_DATE,date); getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent); }将数据存入intent中 ;
然后在目标fragment中调用onActivityResult 方法获取数据
public void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode != Activity.RESULT_OK) { return; } if(requestCode == REQUEST_DATE) { Date date = (Date) data .getSerializableExtra(DatePickerFragment.EXTRA_DATE); mCrime.setDate(date); updateDate(); } }新闻热点
疑难解答