报错信息:activity java.lang.illegalstateexception: recursive entry to executependingt
因为是在activity中直接切换排除getChildFragmentManager ()
上图!
第一次切换的话没问题,来回切速度不快的时候也没问题 但是快速切换的话就会出现这个问题!求解决 debug走到commit后报错 求教
getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, homepageFragment).commit(); 之前我也用哪张方法也报错,换了之后我的就好了,你试一下
你用的是executePendingTransactions,所以快速切换就可能会出现多个fragment嵌套。建议改为beginTransaction。如果不想这样改的话,使用 AsyncTask 去执行 executePendingTransactions()
楼主可以看下这篇博客,希望可以帮到你:http://www.cnblogs.com/over140/archive/2013/05/21/3090978.html
类似的代码,你参考一下,或许你能整起
public class MainActivity extends FragmentActivity {
// 定义控件
private RadioGroup radioGroup;
private RadioButton rbCall;
private RadioButton rbContact;
private RadioButton rbNote;
private RadioButton rbDialing;
private ViewPager viewPager;
private MainPagerAdapter pagerAdapter;
private ArrayList<Fragment> fragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
setViews();
// setPagerAdapter();
setPagerAdapter();
// 设置监听
setListeners();
}
private void setListeners() {
// viewPager控制Randiogroup
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
rbCall.setChecked(true);
break;
case 1:
rbContact.setChecked(true);
break;
case 2:
rbNote.setChecked(true);
break;
case 3:
rbDialing.setChecked(true);
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
// RandioGroup控制ViewPager
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_call:
viewPager.setCurrentItem(0);
break;
case R.id.rb_cotact:
viewPager.setCurrentItem(1);
break;
case R.id.rb_note:
viewPager.setCurrentItem(2);
break;
case R.id.rb_dialing:
viewPager.setCurrentItem(3);
break;
}
}
});
}
private void setPagerAdapter() {
// Fragment集合
fragments = new ArrayList<Fragment>();
// 联系人 如果再出错,就是ContactFragment类导包的的错误
fragments.add(new ContactFragment());
//放起,等会用
//fragments.add(new ContactFragment());
//fragments.add(new ContactFragment());
//fragments.add(new ContactFragment());
// 继承FragmentActivity就会用到这儿
pagerAdapter = new MainPagerAdapter(getSupportFragmentManager());
// 为viewPager配置Adapter
viewPager.setAdapter(pagerAdapter);
}
private void setViews() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
radioGroup = (RadioGroup) findViewById(R.id.rg_RandioGroup);
rbCall = (RadioButton) findViewById(R.id.rb_call);
rbContact = (RadioButton) findViewById(R.id.rb_cotact);
rbNote = (RadioButton) findViewById(R.id.rb_note);
rbDialing = (RadioButton) findViewById(R.id.rb_dialing);
}
// 配置adapter
class MainPagerAdapter extends FragmentPagerAdapter {
public MainPagerAdapter(android.support.v4.app.FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
}
//如果没有看懂的话,加我QQ:57860541 或者微信:18996084015
1、activity java.lang.illegalstateexception: recursive entry to executePendingTransactions.
这个的意思是你递归执行了executePendingTransaction,因为你先执行了commit(),又执行了executePendingTransactions()。
2、executePendingTransactions()方法的意思见下面代码段,前者是异步执行,后者是立即执行。也就是说commit()和executePendingTransactions()只需要执行一个就行。
3、所以解决方案是:删除transaction.commit(); 或者 manager.executePendingTransactions()。
/**
* After a {@link FragmentTransaction} is committed with
* {@link FragmentTransaction#commit FragmentTransaction.commit()}, it
* is scheduled to be executed asynchronously on the process's main thread.
* If you want to immediately executing any such pending operations, you
* can call this function (only from the main thread) to do so. Note that
* all callbacks and other related behavior will be done from within this
* call, so be careful about where this is called from.
*
* @return Returns true if there were any pending transactions to be
* executed.
*/
public abstract boolean executePendingTransactions();
单一的设置:
/**
* 设置当前tab里显示的fragment页面
*
* @param fragment
*/
protected void setFragment(int layout, Fragment fragment) {
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.fragment_enter, R.anim.fade_out);
ft.replace(layout, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
显示隐藏实现:
/**
* 初始化fragment显示界面
*
* @param layout
* @param ltFragmetn
*/
protected void initFragment(int layout, List<BaseFragment> ltFragmetn) {
this.ltFragmetn = ltFragmetn;
this.layout = layout;
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.fragment_enter, R.anim.fade_out);
for (BaseFragment fragment : ltFragmetn) {
transaction.add(layout, fragment).hide(fragment);
}
transaction.show(ltFragmetn.get(show)).commit();
}
/**
* 指定显示的fragment位置
*
* @param index
*/
protected void showFragment(int index) {
if (show != index) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.hide(ltFragmetn.get(show));
BaseFragment fragment = ltFragmetn.get(index);
if (fragment.isAdded()) {
transaction.show(fragment).commit();
} else {
transaction.add(layout, fragment).show(fragment).commit();
}
show = index;
}
}