现在的位置: 首页 > 综合 > 正文

fragment 替换时产生 Recursive entry to executePending 的错误

2013年08月30日 ⁄ 综合 ⁄ 共 1754字 ⁄ 字号 评论关闭


错误的案例:


MainActivity中有2Fragment:
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中的方法:

我们可以在BonAttach方法中拿到OnSearchNoteItemSelectedListener实例:

@Override

public voidonAttach(Activity activity) {

super.onAttach(activity);

if (!(activity instanceofOnSearchNoteItemSelectedListener)) {

throw newIllegalStateException("Activity must implementOnSearchNoteItemSelectedListener");

}

this.onSearchNoteItemSelectedListener= (OnSearchNoteItemSelectedListener) activity;

}

然后在BonActivityCreated方法中做了一些事情后,直接希望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

抱歉!评论已关闭.