Activity中Fragment切换的时候遇到的问题!急求重赏

报错信息: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;
    }
}