Passing Data Between Fragments which belong to different activities

Passing Data Between Fragments which belong to different activities

Step1: 在CrimeActivity中利用intent传送所需信息

public static Intent newIntent(Context packageContext, UUID crimeId) {
    Intent intent = new Intent(packageContext, CrimeActivity.class);
    intent.putExtra(EXTRA_CRIME_ID, crimeId);
    return intent;
}

Step2: 在CrimeListFragment中利用上述方法传送信息

public void onClick(View v) {
    Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId());
    startActivity(intent);
}

Step3: 在CrimeFragment中如何从CrimeActivity中检索crimeId信息

1) 紧耦合方法(不推荐)

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //检索intent传送过来的消息(与activity紧耦合)
    UUID crimeId = (UUID) getActivity().getIntent()
            .getSerializableExtra(CrimeActivity.EXTRA_CRIME_ID);
    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}
 

2)松耦合方法(推荐)但需要更多代码(fragment argument)

2.1)在CirmeFragment中添加方法newInstance方法利用argument

public static Fragment newInstance(UUID crimeId) {
    Bundle args = new Bundle();
    args.putSerializable(ARG_CRIME_ID, crimeId);
    CrimeFragment fragment = new CrimeFragment();
    fragment.setArguments(args);
    return fragment;
}

2.2)在CrimeActivity中利用上述newInstance方法

protected Fragment createFragment() {
    //return new CrimeFragment();
    UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
    return CrimeFragment.newInstance(crimeId);
}

2.3)在CrimeFragment中检索argument信息

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //检索argument传送过来的信息(与activity松耦合)
    UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
    mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
}