第十章的主要内容在于 Fragment与Activity直接的传值。实现了Fragment与Activity之间的传值又有了Activity与Activity之间的传值基础,则能完成Fragment到其余Fragment的传值了。

这种传值方式称为fragment argument.本质是附加一个Bundle给Fragment,过程中需要调用Fragment.setArgument(Bundle)方法.

① 创建Bundle
本例中,由CrimeListActivity 传值crimeId给 CrimeActivity,CrimeActivity再将crimeId传值给CrimeFragment。
所以在这个过程中,需要调用Intent传值,从Intent中提取EXTRA后,塞入Argument Bundle。

protected Fragment creatFragment(){
	UUID crimeId =(UUID) getIntent()
						.getSerializableExtra(EXTRA_CRIME_ID);//从CrimeActivity中拿取crimeId
	return CrimeFragment.newInstance(crimeId);
}

以上的CrimeFragment.newInstance(UUID id);该方法在CrimeFragment中创建,这种方式的目的是,要保证CrimeFragment的复用性,同时保证Bundle的创建在Fragment创建之后,添加给Activity之前。

private static final String ARG_CRIME_ID="crimeId";

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;
}

②获取argument

public void onCreate(Bundle saveInstance){
	UUID crimeId =(UUID) getArguments().getSerlizable(ARG_CRIME_ID);
}

这一章还有一个重点是,如何在关闭CrimeActivity,后更新CrimeListActivity,需要在onResume()

public void onResume(){
	super.onResume();
	updateUI();
}

private void updateUI(){
	CrimeLab crimeLab = CrimeLab.get(getActivity());
	List<Crime> crimes = crimeLab.getCrimes();
	if(mAdapter == null){
		mAdapter = new CrimeAdapter(crimes);
		mCrimeRecyclerView.setAdapter(mAdapter);
	}else{
		mAdapter.notifyDataSetChanged();
	}
}

③通过fragment获取返回结果

调用 Fragment.startActivityForResult(…)
覆盖 Fragment.onActivityResult(…)

④返回activity返回结果值。

public class CrimeFragment extends Fragment{
	...
	public void returnResult(){
		getActivity().setResult(Activity.RESULT_OK,null);
	}
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐