错误的案例:
MainActivity
中有
2
个
Fragment: SearchFragment(A),NoteListFragment(B)
现在在
B
中想启动
A
来替换掉
B
解决办法
:
要想替换
B,
则需要通过宿主
MainActivity
来实现,
onSearchNoteItemSelectedListener
为
mainActivity
实现的接口,
详细信息:
public interface OnSearchNoteItemSelectedListener {
//搜索到的条目被点击触发的事件
public void OnSearchNoteItemSelected(int noteId);
}
我们在mainActivity中实现它:
publicclassNoteForpadListActivity extendsActivity implements OnSearchNoteItemSelectedListener{
//响应点击事件后,启动A替换掉B
@Override
public voidOnSearchNoteItemSelected(int id) {
FragmentA cf =FragmentA.newInstance(id, fid);
FragmentTransaction ft =getFragmentManager().beginTransaction();
ft.replace(R.id.content, cf);
ft.addToBackStack(TAG);
ft.commit();
getFragmentManager().executePendingTransactions();
}
}
再来看看
FragmentB
中的方法:
我们可以在
B
的
onAttach
方法中拿到
OnSearchNoteItemSelectedListener
实例:
@Override
public voidonAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceofOnSearchNoteItemSelectedListener)) {
throw newIllegalStateException("Activity must implementOnSearchNoteItemSelectedListener");
}
this.onSearchNoteItemSelectedListener= (OnSearchNoteItemSelectedListener) activity;
}
然后在B的onActivityCreated方法中做了一些事情后,直接希望A替换掉B,调用
@Override
public voidonActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//do somethings in your code
//调用宿主Activity的替换方法
onSearchNoteItemSelectedListener.OnSearchNoteItemSelected(mNoteId);
return;
}
//
调用此处方法,就会发生上述的错误,也就是说在
B
中直接启动
A
会发生错误。
解决办法:
onActivityCreated
中不做替换操作,
用一个
AsyncTask
来操作,在
AsyncTask
中不做什么操作,当执行完成之后,在
onPostExecute
方法中再调用宿主
Activity
的替换方法,像这样:
privateclasssetAdapterTask extendsAsyncTask<Void, Void, Void> {
protected VoiddoInBackground(Void... params) {
return null;
}
@Override
protected voidonPostExecute(Void result) {
onSearchNoteItemSelectedListener.OnSearchNoteItemSelected((int)(mNoteId));
}
}
参考资料:
Displayfragment viewpager within a fragment