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

错误的案例:

MainActivity中有2Fragment: SearchFragment(A),NoteListFragment(B)

现在在B中想启动A来替换掉B

解决办法:要想替换B,则需要通过宿主MainActivity来实现, onSearchNoteItemSelectedListenermainActivity实现的接口,

详细信息:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值