Android编程权威指南(第三版)第十章:章节梳理
第十章的主要内容在于 Fragment与Activity直接的传值。实现了Fragment与Activity之间的传值又有了Activity与Activity之间的传值基础,则能完成Fragment到其余Fragment的传值了。这种传值方式称为fragment argument.本质是附加一个Bundle给Fragment,过程中需要调用Fragment.setArgument(Bundle)方
第十章的主要内容在于 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);
}
}
更多推荐
所有评论(0)