错误的案例:
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)); } }
参考资料: