Fragment argument---不同托管Activity
2019-01-02 本文已影响0人
爱做梦的严重精神病患者
要想在两个有不同宿主Activity的Fragment之间传递数据,首先要在Fragment中启动另一个Activity。
1.从fragment中启动activity
调用Fragment.startActivity(Intent)。
public class CrimeListFragment extends Fragment{
Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId());
startActivity(intent);
}
当需要的数据通过Intent传递到Activity中后,借助Argument将数据传递给Fragment。这样通过Argument传递,可以将Fragment与Activity相互独立。
2.附加argument给fragment
要附加argument bundle给fragment,需要调用Fragment.setArguments(Bundle)方法。而且,必须要在fragment创建后、添加给activity前完成。
开发人员的习惯做法是:添加名为newInstance()的静态方法给Fragment类。使用该方法,完成fragment实例以及Bundle对象的创建,然后将argument放入bundle中,最后再附加给fragment。
public class CrimeFragment extends Fragment {
private static final String ARG_CRIME_ID = "crime_id";
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;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
}
}
public class CrimeActivity extends SingleFragmentActivity{
public static Intent newIntent (Contenxt packageContext, UUID crimeId) {
Intent intent = new Intent(packageContext, CrimeActivity.class);
intent.putExtra(EXTRA_CRIME_ID, crimeId);
return intent;
}
protected Fragment createFragment() {
UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
return CrimeFragment.newInstance(crimeId);
}
}
3.通过fragment获取返回结果
如需从已启动的activity获取返回结果,则调用Fragment.startActivityForResult(...)方法,并且覆盖Fragment.onActivityResult(...)方法。
public class CrimeListFragment extends Fragment {
Intent intent = CrimeActivity.newIntent(getActivity(), mCrimen.getId());
startActivityForResult(intent, REQUEST_CRIME);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_CRIME) {
}
}
}
尽管Fragment有自己的startActivityForResult(...)方法和onActivityResult(...)方法,但没有setResult(...)方法。所以,应该让托管activity返回结果值。
public class CrimeFragment extends Fragment {
public void returnResult() {
getActivity().setResult(Activity.RESULT_OK, data);
}
}